我已经对这个帖子做过评论,但似乎已经死了所以我开了一个新的:依赖注入Slim Framework 3
上面的帖子解释了如何将Slims Container传递给您自己编写的课程.
但是,OP已经询问是否可以将Slim转换为Dependency Inject 所有类.
我也有兴趣知道是否有办法做到这一点,因为它似乎只是DRY,如果你必须将容器传递给你想要使用它的每个类.
作为一个例子,如果我想使用Slim的一个函数(比如在我自己的一个类中进行重定向),我不能按照文档使用它:
$res->withStatus(302)->withHeader('Location', 'your-new-uri');
Run Code Online (Sandbox Code Playgroud)
因为$res
(响应对象)不在我的类的范围内,除非我注入/传递它.
问题是,如果我说100个课程,我是否必须通过(或注入)容器100次?这看起来真的非常乏味.
在像CakePHP这样的框架中,您可以使用'AppController'来全局执行这样的操作,即定义一次,并使其在所有类中可用.Slim不提供此功能吗?如果没有,这是一个严重的缺点,IMO.
编辑 - 我在其中一条评论中添加此内容,尝试进一步解释问题:
如果您查看First Application Tutorial - http://slimframework.com/docs/tutorial/first-app.html - 他们正在向容器添加PDO数据库连接.
假设我在子目录中有100个单独的类(该示例具有../classes/目录)并使用在index.php中自动加载它们spl_autoload_register()
.容器不适用于任何类别.
如果我不得不分别传递100次,每次我使用我的一个类,只是为了得到一个PDO连接(这只是一个例子),那么这使代码非常重复,即不是DRY.
Geo*_*nov 10
Slim 默认配有Pimple.一些开发人员认为(并且我倾向于同意这些),Pimple不是依赖注入容器,而是服务定位器,因为它不能自己解决依赖关系,需要注册它们.
Slim 3可以与任何实现Container互操作接口的依赖管理器一起使用,PHP-DI就是这样做的.
去寻找这个包.这就是我用于我的项目,因为自动装配,它简直太棒了.简单地说,PHP-DI读取类的构造函数并理解需要注入的内容,不需要像使用Pimple那样注册依赖项.
有时我认为(希望?)PHP-DI将取代Pimple作为Slim的默认DI容器,因为它更简单.
以下是您对Pimple的处理方式:
<?php
namespace Controllers;
class UsersController
{
// Inject Container in controller (which is bad, actually)
public function __construct(ContainerInterface $container)
{
// grab instance from container
$this->repository = $container['userRepository'];
}
// Handler of a route
public function getAllUsers($request, $response)
{
$user = $this->repository->getAllUsers();
return $response->withJson($users);
}
}
Run Code Online (Sandbox Code Playgroud)
这是与PHP-DI相同的控制器:
<?php
namespace Controllers;
class UsersController
{
// Declare your dependencies in constructor:
// PHP-DI will find the classes and inject them automatically
public function __construct(UserRepository $repository)
{
$this->repository = $repository;
}
// Handler of a route
public function getAllUsers($request, $response)
{
$user = $this->repository->getAllUsers();
return $response->withJson($users);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我说100个课程,我是否必须通过(或注入)容器100次?这看起来真的非常乏味.
如果您使用与PHP-DI捆绑在一起的Slim,则问题会通过自动装配自动解决.:)
归档时间: |
|
查看次数: |
5894 次 |
最近记录: |