我已决定抛弃模型文件夹并将所有内容移至repo结构:app/Acme/Foo
所有内容都正确命名空间,但当我尝试访问Bar
内的app/Acme/Foo/Bar.php
类时,我只能将其实例化为new Acme\Foo\Bar();
。否则laravel会在models文件夹中查找它。唯一的解决方法是在实现Bar
类的文件之上的命名空间别名。任何解决方法?根据我的理解,laravel 5可以自动处理,但切换不是首选方法
答案 0 :(得分:4)
我只能将它实例化为新的Acme \ Foo \ Bar(); ...唯一的解决方法是在实现Bar类的文件顶部使用命名空间别名。任何解决方法?
有些(大多数情况下,见下文)没有解决方法,这就是现代PHP的工作原理。您班级的全名实际上是Acme\Foo\Bar
,因此您需要使用它来引用它。如果要通过短名称(Bar
)引用它,则在命名空间声明后使用文件顶部的use
语句。这是现在的工作方式。
Laravel确实有解决方案。如果您查看app/config/app.php
,则会看到以下部分
#File: app/config/app.php
...
'aliases' => array(
'App' => 'Illuminate\Support\Facades\App',
'Artisan' => 'Illuminate\Support\Facades\Artisan',
'Auth' => 'Illuminate\Support\Facades\Auth',
'Blade' => 'Illuminate\Support\Facades\Blade',
'Cache' => 'Illuminate\Support\Facades\Cache',
...
'Eloquent' => 'Illuminate\Database\Eloquent\Model',
该数组允许您为完全命名空间的类设置短别名。 Laravel主要用于Facades,但它也允许你class MyModel extends Eloquent
,Eloquent
真正Illuminate\Database\Eloquent\Model
。您可以将自己的别名添加到此数组
'Bar' => 'Acme\Foo\Bar'
然后使用Bar
在全球范围内引用您的班级。但是,您可能最好习惯于名称空间类的概念,因为这是大多数PHP框架的发展方向。
另外,如果您有点好奇,上面aliases
数组中的别名是通过PHP的class_alias
函数实现的。