Laravel中的正确命名空间

时间:2013-11-18 19:42:55

标签: php laravel laravel-4 composer-php psr-0

我正在尝试在Laravel中对我的模型进行命名空间,并且还可以像普通模型在app / models的根目录中那样自动加载它们。 composer dump-autoload有效,但我不想在创建新模型后运行它。

#app/models/MyNamespace/Thing.php
<?php
namespace App\Models\MyNamespace;
class Thing {
    // ...
}

#app/routes.php
<?php
Route::get('test', function(){
    $thing = new App\Models\MyNamespace\Thing;
});

如果我运行composer dump-autoload一切都很好,否则我会得到一个未找到类的异常。

每次创建新类时,如何在不重建类映射的情况下使这种结构工作?我认为PSR-0是你的命名空间直接与你的目录结构相关的地方,看起来好像我的课程坚持了......

我也尝试使用Workbench,它工作得很好,但理想情况下我想拥有,例如:app / models / MyNamespace,app / models / AnotherNamespace。

1 个答案:

答案 0 :(得分:1)

这不是Laravel&#39;问题,这对于使用Composer的每个应用程序来说都是完全相同的。

如果您的类遵循psr-0规则(目录结构很重要!),您可以在composer.json中配置它

{
    "autoload": {
        "psr-0": {"MyNamespace\\": "app/models"}
    }
}

执行

composer dump-autoload

一旦它会显示在你的autoload_namespaces.php中。之后,Composer将能够通过其命名空间找到您的类,而无需再次dump-autoload

更好地解释它是如何工作的。如果你这样做

"psr-0": {"MyNamespace\\": "app/models"}

你必须这样使用它:

$user = new MyNamespace\User.php

因为Composer将您的命名空间添加到命名空间路径的末尾,并且它希望在

中找到User.php
/var/www/yourappdir/app/models/MyNamespace/User.php

所以,通过做

"psr-0": { "App\\Models\\": "" }

您告诉Composer所有/var/www/yourappdir/App/Models子文件夹都可以包含App \ Models命名空间的命名空间文件。并且您将能够处理以下文件:

$user = new App\Models\User.php  
$user = new App\Models\MyNamespace\User.php  
$user = new App\Models\MyNamespace\Foo\Bar\User.php

如果你这样做

"psr-0": { "App\\Foo": "" }

Composer将能够解决这些命名空间

/var/www/yourappdir/App/Foo
/var/www/yourappdir/App/FooBar
/var/www/yourappdir/App/Foo/Bar
/var/www/yourappdir/App/Foo/Bar/Baz

但如果你这样做

"psr-0": { "App\\Foo\\": "" }

它只能解决

/var/www/yourappdir/App/Foo
/var/www/yourappdir/App/Foo/Bar
/var/www/yourappdir/App/Foo/Bar/Baz