Я разрабатываю 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
и так далее.
Насколько я знаю, если вы используете в своем контроллере в любом методе
public function edit(UpdateEventRequest $req) {
// any code
}
перед запуском // any code
проверка части будет сделана.
Что вы можете попробовать сделать:
update
метод в абстрактном классе для защищенногоpublic function update(Request $request, $id)
в public function update($request, $id)
— Я не знаю, этот шаг будет необходимСоздать новый метод, например 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
,
Вы не можете иметь то же имя для этого метода в дочернем классе, потому что вы получите предупреждение:
Строгие стандарты: декларация Controller :: update () должна быть
совместим с ApiController :: update (X $ x, $ id) в … строке 31
Это все еще будет работать, но я предполагаю, что вы не хотите получать какие-либо предупреждения.
Других решений пока нет …