laravel 4中的自动命名空间别名

时间:2014-09-29 22:19:16

标签: php laravel namespaces

我已决定抛弃模型文件夹并将所有内容移至repo结构:app/Acme/Foo

所有内容都正确命名空间,但当我尝试访问Bar内的app/Acme/Foo/Bar.php类时,我只能将其实例化为new Acme\Foo\Bar();。否则laravel会在models文件夹中查找它。唯一的解决方法是在实现Bar类的文件之上的命名空间别名。任何解决方法?根据我的理解,laravel 5可以自动处理,但切换不是首选方法

1 个答案:

答案 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 EloquentEloquent真正Illuminate\Database\Eloquent\Model。您可以将自己的别名添加到此数组

    'Bar'             => 'Acme\Foo\Bar'

然后使用Bar在全球范围内引用您的班级。但是,您可能最好习惯于名称空间类的概念,因为这是大多数PHP框架的发展方向。

另外,如果您有点好奇,上面aliases数组中的别名是通过PHP的class_alias函数实现的。