2014-07-17 238 views
1

我有一個laravel 4.1應用程序,我在我的應用程序文件夾中創建了一個文件夾來存儲大部分邏輯。Laravel命名空間問題

/app/Acme/Models/ 
/app/Acme/Repositories/ 

這些是兩個主要文件夾。

在我的composer.json中,我有這個在自動加載,並做了一個轉儲運行。

"psr-4" : { 
      "Acme\\" : "app/Acme" 
    } 

但是我越來越,我認爲是愚蠢的問題。例如我的Acme /型號/ Task.php具有以下

<?php 
namespace Acme\Models; 

class Task extends \Eloquent { 

    public function job() 
    { 
     return $this->belongsTo('Job'); 
    } 

} 

但是當我運行它,我得到一個錯誤

Fatal error: Class 'Task' not found in vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 780

在我Job.php我在同一個命名空間文件的頂部....

我必須手動導入/使用在同一名稱空間中的對象嗎? use Acme/Models/Job as Job;?好像這樣的重複...

而在當我設置的namespace Acme/Repositories;命名空間我的庫文件夾,我必須使用項目,如

use Acme\Models\Job as Job;

我的,有點失落!

回答

2

命名空間是相對的,因此您不需要添加用於直接引用同一命名空間內的類。

你所得到的錯誤是因爲你需要完全限定關係,命名空間模型,滔滔不絕知道在哪裏可以找到他們如

$this->belongsTo('\Acme\Models\Jobs'); 

在你的資料庫命名空間的情況下,你需要添加一個使用聲明在你的文件中,或者引用完全限定的命名空間,例如new \ Acme \ Models \ Job();我知道PHPStorm(並且我相信其他IDE)會爲你注入命名空間,這是非常有用的,並且每次引用一個類時都不用寫全部命名空間,值得檢查。

編輯:對不起,我第一次沒有正確地閱讀這個問題 - 更新了我的答案。

+0

裘德,我以爲因爲在Task.php我使用名稱空間Acme \ Models;我可以使用Job,因爲它在相同的範圍內......? – Wizzard

+0

對不起,我在線上說他們在同一個NS,並假定你的意思是另一個類在Acme \ Repository NS。你是對的,它應該是相對的,但是你得到的錯誤是來自完全不同的問題......你只需要完全限定關係。例如$ this-> belongsTo('\ Acme \ Models \ Job'); – judereid