2014-10-03 3 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, я смогу использовать UpdateEventRequest и CreateEventRequest и так далее.

ответ

1

Насколько я знаю, если вы используете в контроллере в любом методе

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

перед запуском // any code проверки части будет сделано.

Что вы могли бы попробовать сделать:

  1. Измените метод update в абстрактном классе защищаемого
  2. Изменение подписи этого метода от public function update(Request $request, $id) к public function update($request, $id) - я не знаю, этот шаг будет необходимо
  3. Создать новый метод, например realUpdate со следующим кодом:

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

Я не уверен в шаге 2, потому что не знаю, будет ли Laravel пытаться выполнить любую проверку, если вы используете Request в своем абстрактном классе. Возможно также, что он снова запустит эту проверку для 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

Однако он будет работать, но я полагаю, вы не хотите иметь никаких предупреждений.

Смежные вопросы