Laravel вызывать действие приложения VS напрямую вызывать объект класса - PullRequest
1 голос
/ 23 января 2020

Когда мы можем вызвать метод контроллера напрямую, создав такой объект класса, как этот

Route::get( 'url/{parameters}', function() {
  $controller = new ClassController;
  return $controller->classMethod($parameters);
});

, почему мы должны использовать действие приложения и вызова?

Route::get( 'url/{parameters}', function() {
  $controller = app()->make('ClassController');
  return $controller->callAction('classMethod', $parameters);
});

Есть ли какое-то преимущество для вызова раскрытие / нарушение действия или безопасности для объекта класса вызова напрямую?

1 Ответ

1 голос
/ 23 января 2020

Разница между new ClassController и app()->make('ClassController') заключается в том, что при использовании app()->make вы используете Laravel служебный контейнер для «разрешения» экземпляра ClassController.

Контейнер службы упрощает разрешение зависимостей. Например, если ваш конструктор ClassController имел зависимости, такие как ClassRepository, когда вы используете шаблон проектирования репозитория, он может быть разрешен контейнером, вместо того, чтобы вам пришлось передавать ему новый экземпляр, например new ClassController(new ClassRepository(new User)).

Это также делает ваш код более легко тестируемым. Вы сможете использовать макетный экземпляр либо вашего контроллера, либо зависимостей вашего контроллера, когда вы хотите протестировать свой код.

Однако использование new ClassController вместо app()->make('ClassController') не делает ' t сделать ваш код более или менее небезопасным.

На этом этапе, кажется, нет принципиальной разницы между использованием ->classMethod($parameters) и ->callAction('classMethod', $parameters). Из источника кажется, что callAction просто использует call_user_func_array для вызова метода, который вы передаете, используя параметры. Я подозреваю, что это может быть просто оставлено в коде по причинам совместимости, потому что callAction раньше делал больше в старых версиях Laravel.

Он все еще использует с помощью механизма маршрутизации Laravel, так что вы можете использовать его в случае, если callAction будет обновлено в будущем. Тем не менее, на этом этапе нет никакой разницы между этими двумя, кроме того, что с callAction вы сможете вызывать частные и защищенные функции на контроллере.

В целом нет никаких причин, связанных с безопасностью вам нужно использовать app()->make и callAction, но из соображений тестируемости и удобства (в случае app()->make) и из соображений совместимости (в случае callAction) вы можете использовать их.

...