2014-10-03 77 views
1

我正在開發一個API,因爲我有(大部分)相同的功能,我創建了一個抽象類來擴展我的控制器。我如何將請求類傳遞給我的抽象類?

我的抽象類是這樣的:http://laravel.io/bin/23Bzj

凡在控制器我會用模型和響應構建(可能會移動到ApiController構造後響應)。

class EventController extends ApiController 
{ 

    public function __construct(Event $model, ResponseRepository $response) 
    { 
    $this->model = $model; 
    $this->response = $response; 
    } 
} 

但問題是:我如何能夠使用特定Request類在我ApiController使用的用於驗證的方法/什麼是最好的做法。

我可以使用正常的Request類,但然後我不會有任何驗證之前的方法。

當我在我的EventController我可以使用UpdateEventRequestCreateEventRequest等。

回答

1

據我知道,如果你在你的控制器中的任何方法

public function edit(UpdateEventRequest $req) { 
    // any code 
} 

推出// any code部分確認將完成之前使用。

什麼,你可以嘗試做:

  1. 在抽象類更改update方法從public function update(Request $request, $id)這種方法的保護
  2. 更改簽名public function update($request, $id) - 我不知道它這一步是必要的
  3. 用下面的代碼創建例如realUpdate新方法:

    public function realUpdate(UpdateEventRequest $req, $id) { 
        parent::update($req, $id); 
    } 
    

我不確定第2步,因爲我不知道如果在抽象類中使用Request,Laravel是否會嘗試運行任何驗證。它也可能會再次運行此驗證UpdateEventRequest - 您應該嘗試一下,我沒有測試過它。

基本上你將有類似下面的代碼:

<?php 

class X 
{ 

} 

class Y extends X 
{ 

} 


abstract class ApiController 
{ 

    protected function update(X $x, $id) 
    { 
     echo "I have " . get_class($x) . ' and id ' . $id; 
    } 
} 


class Controller extends ApiController 
{ 

    public function realUpdate(Y $y, $id) 
    { 
     parent::update($y, $id); 
    } 
} 

$c = new Controller(); 
$c->realUpdate(new Y, 2); 

和Laravel應該UpdateEventRequest規則上至少運行一次驗證爲主。

你不能有相同的名字在子類這種方法,因爲你會得到一個警告:

嚴格的標準:控制器::更新的聲明()應該是 與ApiController兼容::更新( X $ x,$ id)in ... line 31

然而它仍然可以工作,但我認爲你不想有任何警告。

相關問題