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

问题描述 投票:1回答:1

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

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

直接进行呼叫类对象的呼叫操作或安全公开/违反有任何好处吗?

php laravel performance security laravel-routing
1个回答
0
投票

new ClassControllerapp()->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之外,这两者之间没有其他区别,您将可以在控制器上调用私有和受保护的函数。

全部而言,使用callActionapp()->make并没有与安全性相关的原因,但出于可测试性和方便性的原因(对于callAction,出于兼容性原因)(对于app()->make)中,您可能想使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.