php - 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);
});
直接调用类对象的调用操作或安全披露/违反是否有任何优势?
解决方案
new ClassController
和之间的区别在于app()->make('ClassController')
,当你使用app()->make
Laravel 的服务容器来“解析” 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()->make
and callAction
,但出于可测试性和方便的原因(在 的情况下app()->make
)以及出于兼容性的原因(在 的情况下callAction
),您可能想要使用它们。
推荐阅读
- c# - C# - 同步调用 C DLL 函数
- python - Django Form is_valid() 与 python3 不兼容
- php - 使用 TCPDF 和 buttonImportIcon() 以 PDF 格式上传图像
- c - C:使用指针从不同函数更新 main 中的变量时出现问题
- verilog - Verilog中的组合电路使用assign和always块有什么区别?
- python - Pydantic - 将对象升级到另一个模型
- http-status-code-404 - phpstorm 404(未找到)
- javascript - 在浏览器上渲染 .3ds 文件
- python - 列表中项目的字符串替换
- ruby - 如何为 RbConfig::CONFIG 赋值