【问题标题】:Composer auto-load fails inside post-install scriptComposer 自动加载在安装后脚本中失败
【发布时间】:2016-01-06 06:05:39
【问题描述】:

运行安装后命令时,似乎 composer 无法加载 psr-4 类。

这是我的 composer.json:

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

ComposerScript.php 包含:

<?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();
    }
}

运行后composer install 输出:

生成自动加载文件 ComposerScript\ComposerScript::postInstall

类存在:bool(false)

PHP 致命错误:类 在第 19 行的 /var/www/project/ComposerScript.php 中找不到“Modules\Common\Services\RouterService”

当从 apache 自动加载器运行项目时工作正常。 在本地也可以工作。 可能是一些服务器配置,但是哪一个....

任何帮助或参考表示赞赏。

【问题讨论】:

  • 文件modules\Common\Services\RouterService.php是否存在?注意区分大小写!
  • @Sven,是的,它存在。我无法调试任何东西也很有趣,因为作曲家覆盖了 ClassLoader.php

标签: php composer-php package-managers


【解决方案1】:

问题在于 PSR-4 自动加载:

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

文件夹的首字母大写,如类名:

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


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

应该匹配:

-Modules
 -Common
  -Services
   -RouterService.php

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 2017-08-02
    • 2021-08-10
    • 2015-02-11
    • 2018-07-21
    • 1970-01-01
    • 2020-01-25
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多