0

Seems like composer can't load psr-4 class when running post-install command.

Here is my composer.json:

{
  "autoload": {
      "psr-4": {
        "Modules\\": "modules/",
        "ComposerScript\\": ""
      }
  },
 "scripts": {
    "post-install-cmd": [
      "ComposerScript\\ComposerScript::postInstall"
    ]
  }
}

ComposerScript.php contains:

<?php

namespace ComposerScript;

use Modules\Common\Services\RouterService;
use Composer\Script\Event as ComposerEvent;

class ComposerScript
{

    public static function postInstall(ComposerEvent $event)
    {

        $vendorDir = $event->getComposer()->getConfig()->get('vendor-dir');

        require $vendorDir . '/autoload.php';

        echo 'class exist: ';
        var_dump(class_exists('Modules\Common\Services\RouterService'));

        $router = new \Modules\Common\Services\RouterService();
    }
}

After running composer install Output:

Generating autoload files ComposerScript\ComposerScript::postInstall

class exist: bool(false)

PHP Fatal error: Class 'Modules\Common\Services\RouterService' not found in /var/www/project/ComposerScript.php on line 19

When running project from apache autoloader works properly. Also locally it works. Probably some server configuration, but which one....

Any help or reference appreciated.

Community
  • 1
  • 1
Alex Kalmikov
  • 1,865
  • 19
  • 20

1 Answers1

1

Issue was with PSR-4 autoloading:

http://www.php-fig.org/psr/psr-4/

Folders should be with first letter upper case like class name:

{
  "autoload": {
      "psr-4": {
        "Modules\\": "Modules/",
        "ComposerScript\\": ""
      }
  }
}


$router = new \Modules\Common\Services\RouterService();

Should match:

-Modules
 -Common
  -Services
   -RouterService.php
Alex Kalmikov
  • 1,865
  • 19
  • 20