2014-09-29 67 views
2

我已经决定放弃模型文件夹和移动的一切回购结构:app/Acme/Foo自动命名空间别名4

一切都是正确的命名空间,但是当我尝试访问内部app/Acme/Foo/Bar.phpBar类我只能实例它作为new Acme\Foo\Bar();。否则,laravel会在models文件夹中查找它。唯一的解决方法是在实现Bar类的文件顶部命名空间别名。任何解决方法?从我理解laravel 5自动处理这个,但切换不是首选选项

回答

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函数实现的。