【问题标题】:Proper Namespacing in LaravelLaravel 中正确的命名空间
【发布时间】:2013-12-02 02:37:14
【问题描述】:

我正在尝试在 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。

【问题讨论】:

  • 我猜这是因为app/Appmodel/Model 的大小写不同。如果您在 Unix 环境中,PHP 对目录名区分大小写...
  • 我已经尝试了这两种方法,但不幸的是(在我家里的 Mac 或工作的 Windows 上)都没有改变。 :(

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


【解决方案1】:

这不是 Laravel 的“问题”,它可以在每个使用 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 ALL /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

【讨论】:

  • 那会是 app/src/Acme,对吧?理想情况下,我想做 app/models/Acme。
  • 您的编辑效果很好:) 虽然,最后一件事......为什么这会导致类未找到异常? "App\\Models\\MyNamespace\\": "app/models/MyNamespace" 尝试创建新的 App\Models\MyNamespace\Thing; 时?
  • 查看 autoload_classmaps.php 以查看它们是否仍然存在以及它们是否不冲突。您的命名空间不应显示在那里,只是 autoload_namespaces.php 中的命名空间根文件夹。
  • 它在类映射文件中为'App\\Models\\MyNamespace\\Test' =&gt; $baseDir . '/app/models/MyNamespace/Test.php',我的composer.json在psr-0字段中有这个条目:"App\\Models\\MyNamespace\\": "app/models/MyNamespace"。它在转储自动加载后工作。我不确定我哪里出错了。
  • 您仍然有指向该目录的“自动加载”“类映射”,您必须选择一个或另一个。一种选择是将命名空间模型放在不同的目录中。
猜你喜欢
  • 1970-01-01
  • 2018-05-11
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多