首页 > 解决方案 > Laravel 调用 app 动作 VS 直接调用类对象

问题描述

当我们可以像这样通过创建类的对象直接调用控制器方法时

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

直接调用类对象的调用操作或安全披露/违反是否有任何优势?

标签: phplaravelperformancesecuritylaravel-routing

解决方案


new ClassController和之间的区别在于app()->make('ClassController'),当你使用app()->makeLaravel 的服务容器来“解析” ClassController.

服务容器使得解析依赖更方便。例如,如果您ClassController的构造函数具有依赖关系,例如ClassRepository当您使用存储库设计模式时,它可以由容器解决,而不是您必须向它传递一个新实例,例如new ClassController(new ClassRepository(new User)).

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

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

->classMethod($parameters)在这个阶段,使用和似乎基本没有区别->callAction('classMethod', $parameters)。从源代码看来,它似乎callAction只是call_user_func_array用来调用您使用参数传递它的方法。我怀疑它可能只是出于兼容性原因而留在代码中,因为它曾经在版本的 LaravelcallAction中做更多事情。

它仍然Laravel 的路由机制使用,所以你可能想要使用它以防callAction将来更新。但是,在这个阶段,两者之间没有区别,除了callAction您将能够在控制器上调用私有和受保护的功能。

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


推荐阅读