PSR-0 自动加载机问题



我在PSR-0自动加载项目中按路径实例化类时遇到问题。结构如下:

| - src/
|    - Models/
|        - My_New_Model_Migration.php
|        - ...
|    SeederCommand.php
| - vendor/
|     - ...
| composer.json

和作曲家自动加载器:

"autoload": {
"psr-0": {
"" : [
"src/"
]
}
}

SeederCommand类中没有太多内容,它基本上是一个学说/迁移类,应该使用up()down()方法创建迁移。

在负责生成这些函数的函数中,我有这部分:

if (file_exists(__DIR__ . "/Models/{$model}_Migration.php")) {
$class = "{$model}_Migration";
$instantiated = new $class;
....
}

回显时,我注意到该文件确实存在,因此这部分正常工作。但是,在更新课程时,我收到错误:

PHP 致命错误:未捕获错误:类 '/var/www/html/.../src/Models/My_New_Model_Migration.php' 在 中找不到/var/www/html/.../src/SeederCommand.php:97

由于路径是正确的,我认为问题一定是PSR-0自动加载器通过下划线解析路径来工作?

有没有办法解决它?

编辑:

这个答案对我没有帮助,因为它解释了自动加载机故事的"原因"。我知道PSR-0PSR-4自动加载机如何在高层次上工作。我想要一种方法来解决自动加载器想要一个没有目录结构的事实(我不希望在这种情况下引入它(。

编辑2:

SeederCommand类需要自动加载文件:

require "../vendor/autoload.php"; 

我尝试做一个dump-autoload并将类重命名为没有下划线的类,并且发生了同样的事情,所以我可能在自动加载本身方面做错了什么。

编辑3:

我尝试将一个我重命名为非下划线版本的类更新。例如,新MyNewClass有效,但My_New_Class抛出错误。

类名中不能有下划线,目录结构中不能有下划线。

如果您的类名为Models_MyWhatever_Migration,因为您在迁移过程中将字符串"MyWhatever"动态添加到类名中,因此该类必须放在src/Models/MyWhatever/Migration.php中。你不能在src/Models/MyWhatever_Migration.php中拥有它.

如果要将下划线保留为文件名的一部分,则必须切换到 PSR-4 并使用命名空间。

创建新

类的实例时出错

$class = __DIR__ . "/Models/{$model}_Migration.php";
$instantiated = new $class;

这是错误的,因为您无法通过文件名创建类的实例,例如:

$instance = new /var/www/html/.../Class.php; // <-- wrong

相反,您需要使用类名和命名空间:

$instance = new ProjectNamespaceClass;

所以在你的具体情况中,它可能是这样的

$class = "\Project\Models\".$model."_Migration";
// ^ depends on the real namespace and name of your migration classes
$instantiated = new $class;

PSR-0 和下划线

再次阅读PSR-0标准后,老实说,我认为在使用PSR-0时没有办法实现您想要的(具有带下划线的类名但没有目录(。该标准明确指出:

类名中的每个 _ 字符都转换为DIRECTORY_SEPARATOR。

可能的解决方案:类图自动加载器

但是你可以对这些文件使用作曲家的类映射自动加载器:

此映射是通过扫描给定目录/文件中所有.php和 .inc 文件中的类来构建的。您可以使用类图生成支持来定义不遵循 PSR-0/4 的所有库的自动加载。要配置此项,请指定要搜索类的所有目录或文件。

它可能看起来像那样(但我无法测试它(:

"autoload": {
"psr-0": {
"" : [
"src/"
]
},
"classmap": ["src/Models/"]
}

相关内容

  • 没有找到相关文章

最新更新