Правильно ли писать статичные методы контроллера?
Есть роут:
Route::post('/update_send_to_production_event', 'PreorderController@updateSendToProductionEvent');
Я написал метод:
public static function updateSendToProductionEvent(Request $request): void {
SendToProduction::dispatch($request->preorder_id, $request->status_id, $request->during);
}
Мне сделали замечание, что тут не должно быть static так как этот метод не вызовется нигде из кода, кроме маршрутов, а если будет вызываться, то это нарушение принципов SOLID.
Корректно ли писать здесь static?
Ответы (2 шт):
этот метод не вызовется нигде из кода, кроме маршрутов, а если будет вызываться, то это нарушение принципов
SOLID.
Не вижу проблемы в том чтобы вызвать этот метод из другой части программы, с какой бы целью это не производилось.
Не вижу в этом нарушения принципов SOLID, ведь если мы сделаем вызов этого метода из "роута" и из другой части кода (имитируя или "проксируя" из другого места Request) - поведение метода и результат всегда будет в одном виде который продекларирован заголовком и реализацией метода.
Получается даже наоборот - принцип единой ответственности метода будет соблюдён.
Другое дело что вариантов реализаций вашего кода есть несколько и более красивая была бы реализация такая, где метод производящий конкретное действие находится в классе по работе с соответствующей сущностью, а метод контроллера будет выступать лишь как входная точка, которая лишь передаст управление дальше соответствующему методу класса.
Таким образом мы добьёмся дополнительного уровня абстракции, добавится прослойка.
В вашем случае меньше абстракции - но это не является ошибкой, если вы в этой абстракции и не нуждаетесь.
Все верно, static используется для того, чтобы использовать метод не создавая экземпляр класса.
Но Ваш метод предназначен для обработки маршрута - здесь подразумевается, что входящие данные из Request будут подготовлены (например данные будут переданы в Validator) и далее переданы в метод-обработчик.
Вызов метода updateSendToProductionEvent из другого контроллера с "имитацией" Request - будет немного не корректным (крайне редко может понадобиться - например для тестов), так как сервер должен работать с конкретными данными.
Принцип Single responsibility - подразумевает, что метод используется по своему прямому назначению и отвечает только за одну логику, которая в данном случае является обработкой входящего запроса и проверкой данных (что логично так как запрос POST) с последующим проксированием в метод-обработчик. Поэтому можно засчитать за нарушение, если вызывать его из другого класса.
Если предполагается использование этого метода в других классах, то разделите вашу логику на 2 метода. Первый non static будет принимать Request и проверять данные и второй static который будет уже непосредственно работать с подготовленными данными.
Краткий вывод - в конкретном примере static не нужен.