当我们可以通过像这样的类的对象直接调用控制器方法时
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);
});
直接进行呼叫类对象的呼叫操作或安全公开/违反有任何好处吗?
new ClassController
和app()->make('ClassController')
之间的区别在于,当您使用app()->make
时,您是在使用Laravel的service container来“解析” ClassController
的实例。
服务容器使解析依赖关系更加方便。例如,如果您在使用存储库设计模式时ClassController
的构造函数具有诸如ClassRepository
之类的依赖关系,则可以通过容器来解析它,而不必将其传递给新实例,例如new ClassController(new ClassRepository(new User))
。
这也使您的代码更易于测试。当您要测试代码时,可以使用控制器或控制器依赖项的mock instance。
但是,使用new ClassController
而不是app()->make('ClassController')
不会使您的代码多少有些不安全。
在此阶段,使用->classMethod($parameters)
和->callAction('classMethod', $parameters)
似乎基本上没有区别。从source看来,callAction
只是使用call_user_func_array
来调用您使用参数传递它的方法。我怀疑出于兼容性原因它可能只留在代码中,因为call_user_func_array
在Laravel的callAction
版本中曾经做过更多工作。
它仍然通过Laravel的路由机制获得older,因此您可能想使用它,以防将来used被更新。但是,在此阶段,除了callAction
之外,这两者之间没有其他区别,您将可以在控制器上调用私有和受保护的函数。
全部而言,使用callAction
和app()->make
并没有与安全性相关的原因,但出于可测试性和方便性的原因(对于callAction
,出于兼容性原因)(对于app()->make
)中,您可能想使用它们。