2014-09-29 66 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函數實現的。