composer.json包含以下内容
...
"autoload": {
...
"psr-0":{"Acme": "app/lib"}
},
在app / lib / Acme / Models / Product / Display.php我有以下内容:
<?php
namespace Acme\Models\Product;
use Eloquent;
use Db;
class Product_Display extends Eloquent
{
如果在存储库类的Class Name中给出下划线,我就失去了如何调用该类:
<?php
namespace Acme\Repositories;
use Acme\Models\Product\Display as Product_Display;
...
Product_Display::where('page_id','=',$page_id)->first();
这给了我一个'Acme \ Models \ Product \ Display'类找不到错误。 我猜测问题在于使用Acme \ Models \ Product \ Display作为Product_Display,但我尝试了几种变体,但似乎都没有解决问题。
答案 0 :(得分:1)
你是作曲家dump-autoload吗?通过从项目的根目录在终端中键入composer dump-autoload
来执行此操作。
每次更改composer.json文件时,都需要让composer重建自动加载文件。在psr-0的情况下,这就是你需要做的全部。
对于类映射自动加载,每次将文件添加到自动加载的目录时,都需要编写转储自动加载。
编辑:
要解决此问题:将use Acme\Models\Product\Display as Product_Display;
更改为use Acme\Models\Product\Display
。将类名从Product_Display更改为Display。
我想我发现了这个问题。您有use Acme\Models\Product\Display as Product_Display;
但需要use Acme\Models\Product\Product_Display;
,因为use语句的最后一部分是类的名称。在这种情况下,您的类实际上名为Product_Display,而不是Display(文件名)。您可能还需要更改文件名以匹配类名(为了达到惯例,您也应该这样做)。
答案 1 :(得分:1)
您正在使用PSR-0自动加载。在构建文件路径时,此方案会将每个反斜杠和每个下划线转换为目录分隔符。
因此,在路径Acme\Whatever_Underscored
中搜索prefix/Acme/Whatever/Underscored.php
。
对于PSR-4,规则已更改。首先,它仅适用于命名空间类,不适用于旧的Acme_Underscore_Endless_Classnames
。其次,如果您不想,则不必具有一组其他空目录。第三:下划线不会转换为目录分隔符。
使用PSR-4规则,将在路径Acme\Whatever_Underscored
中搜索prefix/Acme/Whatever_Underscored.php
-甚至在prefix/Whatever_Underscored.php
的路径中进行搜索。
您感到困惑,因为您将代码中的类名与文件的路径连接在一起。 PHP仅关心use
导入中的类名。始终使用班级文件中定义的班级名称。然后,自动装带器将启动并尝试查找匹配的文件-具有PSR-0或PSR-4的规则。如果找不到正确的文件(路径未正确指向文件,或者文件不包含要搜索的类),则会出现错误。