2015-04-17 15 views
0

我想有一個APIController所以我想交換它們提供的功能只是作爲laravel的默認路由控制器作爲同一如下如何在參數改變混凝土類名稱派生類方法

//Routes.php 
Route::resource('keys', 'KeysController'); 
Route::resource('SomeOther', 'SomeOtherController'); 





abstract class APIController extends Controller { 

    public function store() 
    { 
     return $this->respondNotSupported(); 
    } 


} 

class KeysController extends APIController { 


    public function store(KeysRequest $request) 
    { 
     $input = Request::all(); 
     $newkey = Key::create($input); 
     return $newkey->id; 
    } 
} 


class SomeOtherController extends APIController { 


    public function store(SomeOtherRequest $request) 
    { 
     $input = Request::all(); 
     $newkey = SomeOtherModel::create($input); 
     return $newkey->id; 
    } 
} 

類,就像爲laravel可以接受FormRequest任何類的存儲方法

但我得到以下錯誤,

Declaration of App\Http\Controllers\KeysController::store() should be compatible with App\Http\Controllers\APIController::store() 

這是很好的,因爲簽名不符。那麼我怎麼能做到這一點?我在哪裏可以找到laravel如何能夠接受任何類型的爭論。

+0

這是不可能的。 Laravel也不這樣做。在框架中沒有實際操作的抽象控制器('store()'等),因爲這是不可能的。你想用這個達到什麼目的?只是'respondNotSupported'的東西? – lukasgeiter

+0

SomeOtherRequest和KeysRequest派生自Illuminate \ Foundation \ Http \ FormRequest類如果我之間沒有APIController類,那麼事情會很好。截至目前,我只是有'respondNotSupported'。所以拉拉維爾以某種方式做它。怎麼樣 ? – Amit

回答

2

你根本無法做到這一點。 (和Laravel不會做,要麼)


你能做些什麼來處理你的抽象控制器缺少的方法是用魔術方法__call()。如果實現,如果您的控制器上調用了不存在的方法,則該方法將由PHP調用。

這是Laravel確實在Illuminate\Routing\Controller

public function __call($method, $parameters) 
{ 
    throw new BadMethodCallException("Method [$method] does not exist."); 
} 

這意味着你可以做幾乎同樣與respondNotSupported

public function __call($method, $parameters) 
{ 
    return $this->respondNotSupported(); 
} 

而且很明顯,你可以使用$method(這僅僅是名稱被叫方法)做一些更復雜的過濾:

public function __call($method, $parameters) 
{ 
    if($method == 'store'){ 
     return $this->respondStoreNotSupported(); 
    } 
    return $this->respondNotSupported(); 
} 
+0

這肯定會回答我的問題,謝謝。你可以請我指出正確的方向,如何在控制器中的方法能夠接受請求或從FormRequest的Request派生的任何其他類呢? – Amit

+0

由於方法簽名僅在控制器本身中定義,因此它可以是控制器所需的任何內容。如果您問的是實際如何傳遞對象,那就是通過Laravels IoC容器進行依賴注入的神奇之處。基本上Laravel分析你鍵入的參數並解決這些依賴關係... – lukasgeiter

+0

好吧,完美!一切都很有意義。 我想我試圖在自己的控制器上以某種方式實現同​​樣的魔法。 – Amit