我正在使用Slim Framework3。我想将中的$logger
定义注入dependencies.php
到Router Controller类中。以下是我的工作,是否有更好的方法?
routes.php
$app->get('/test', function($request, $response, $args){
$controller = new AccountController($this->get('logger'));
return $controller->test($request, $response, $args);
});
AccountController
class AccountController{
private $logger;
function __construct($logger){
$this->logger = $logger;
}
public function test($request, $response, $args){
$this->logger->info('i am inside controller');
return $response->withHeader('Content-Type', 'application/json')->write('test');
}
}
在Slim Framework 3文档中,使用路由控制器的正确方法应该是:
$app->get('/test', 'AccountController:test');
但是,$logger
当我选择以更加“优雅”的方式编写我的Route Controller时,如何注入AccountController?
根据容器解析文档,您应该能够通过容器在控制器内部访问记录器:
AccountController
class AccountController
{
protected $ci;
//Constructor
public function __construct(ContainerInterface $ci)
{
$this->ci = $ci;
}
public function test($request, $response, $args)
{
$this->ci->get('logger')->info('i am inside controller');
return $response->withHeader('Content-Type', 'application/json')->write('test');
}
}
调用时$app->get('/test', 'AccountController:test');
,Slim应该自动将容器传递到AccountController
的构造函数中。
话虽这么说,这比一个出色的设计示例更具有便利性。正如Rob Allen在他的回答中所解释的那样,通过将控制器注入到应用程序容器中,而不是将容器注入到每个控制器中,可以实现更好的模块化,从而可以更轻松地测试代码(如果您正在使用单元测试)。
看一下他的Slim应用示例。例如AuthorController
,如果您看一下,您会发现使用此设计控制器类如何不再依赖于提供所有服务的神奇容器。相反,您可以在构造函数中明确说明每个控制器将需要哪些服务。这意味着您可以更轻松地模拟测试方案中的各个依存关系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句