Php Laravel调用应用程序操作与直接调用类对象

Php Laravel调用应用程序操作与直接调用类对象,php,laravel,performance,security,laravel-routing,Php,Laravel,Performance,Security,Laravel Routing,当我们可以通过像这样创建类的对象直接调用控制器方法时 Route::get( 'url/{parameters}', function() { $controller = new ClassController; return $controller->classMethod($parameters); }); 为什么我们应该使用应用程序和呼叫操作 Route::get( 'url/{parameters}', function() { $controller = app(

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

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

直接调用类对象的调用操作或安全泄露/破坏是否有任何好处?

新类控制器和
app()->make('ClassController')
之间的区别在于,当您使用
app()->make
时,您正在使用Laravel来“解决”
ClassController
的实例

服务容器使解决依赖关系更加方便。例如,如果在使用存储库设计模式时,
ClassController
的构造函数具有依赖项,例如
ClassRepository
,则可以由容器解析,而无需向其传递新实例,例如
newclasscontroller(newclassrepository(new User))

它还使您的代码更易于测试。当您想要测试代码时,您将能够使用控制器或控制器依赖项的一部分

但是,使用
newclasscontroller
而不是
app()->make('ClassController')
并不会使代码或多或少不安全

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

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

总之,没有任何与安全相关的原因需要您使用
app()->make
callAction
,但是出于可测试性和方便性的原因(对于
app()->make
)以及兼容性的原因(对于
callAction
),您可能需要使用它们