Laravel 调用应用程序操作 VS 直接调用 class 对象

Laravel call app action VS call class object directly

当我们可以像这样创建class的对象直接调用controller方法时

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);
});

直接调用 class 对象的调用操作或安全性 disclosure/breach 有什么优势吗?

new ClassControllerapp()->make('ClassController') 的区别在于,当您使用 app()->make 时,您使用的是 Laravel 的 service container 到 "resolve" ClassController.

的实例

服务容器让解决依赖更方便。例如,如果您的 ClassController 的构造函数在您使用存储库设计模式时具有诸如 ClassRepository 之类的依赖项,则它可以由容器解决,而不必向它传递一个新实例,例如new ClassController(new ClassRepository(new User)).

它还使您的代码更易于测试。当您想要测试代码时,您可以使用控制器或控制器依赖项的 mock instance

但是,使用 new ClassController 而不是 app()->make('ClassController') 不会使您的代码或多或少变得不安全。

现阶段使用->classMethod($parameters)->callAction('classMethod', $parameters)似乎基本没有区别。来自 Laravel.

source it seems that callAction simply uses call_user_func_array to call the method you pass it using the parameters. I suspect it might just be left over in the code for compatibility reasons because callAction used to do more in older 版本

它仍然通过 Laravel 的路由机制获得 used,因此您可能希望使用它以防 callAction 将来更新。但是,在这个阶段,除了 callAction 之外,两者之间没有区别,您将能够在控制器上调用私有和受保护的函数。

总而言之,没有安全相关的原因需要使用 app()->makecallAction,但出于可测试性和方便的原因(在 app()->make 的情况下) 并且出于兼容性原因(在 callAction 的情况下)您可能想要使用它们。