Как мне передать класс запроса в мой абстрактный класс?

Я разрабатываю 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,

Вы не можете иметь то же имя для этого метода в дочернем классе, потому что вы получите предупреждение:

Строгие стандарты: декларация Controller :: update () должна быть
совместим с ApiController :: update (X $ x, $ id) в … строке 31

Это все еще будет работать, но я предполагаю, что вы не хотите получать какие-либо предупреждения.

1

Другие решения

Других решений пока нет …