在非控制器类上使用slim容器的正确方法(如果有的话)是什么

时间:2017-03-02 12:10:00

标签: slim

我有一个孤立的类文件,它在一个超薄的控制器或循环之外:

class UserModel
{


    public function getSingleUser( string $field, $value )
    {
        return ( new DbSql )->db()->table( 'users' )->where( $field, $value )->first();
    }
}

我想通过访问也在slim容器中注册的此服务来替换DbSql类的实例化。

问题:

1)如何从这个类中访问slim容器?

2)我在文档中没有看到这样的例子,是否应该避免?我应该避免从超薄控制器外部进入细长容器吗?

1 个答案:

答案 0 :(得分:1)

  

我在doc

中没有看到这样的例子

这可能是因为容器是Slim的依赖 - > Pimple

  

我应该避免从超薄控制器外部访问超薄容器吗?

不,实际上容器应该用于构建所有对象

  

如何从此课程中访问slim容器

您不应该在课堂上访问DI-Container。相反,容器应该在构造函数中注入所需的实例。

首先,当您已经完成此操作时,将IF Object_id('TEMPDB.schema_name.table', 'U') IS NOT NULL DROP TABLE table; 添加到容器中:

DbSql

然后将$app = \Slim\App(); $container = $app->getContainer(); $container['DbSql'] = function($c) { return new DbSql(); }; 添加到容器中并添加UserModel作为构造函数参数

DbSql

将构造函数添加到$container['UserModel'] = function($c) { return new UserModel($c['DbSql']); };

UserModel

现在您可以从容器中获取class UserModel { private $dbSql; public function __construct(DbSql $dbSql) { $this->dbSql = $dbSql; } public function getSingleUser( string $field, $value ) { return $this->dbSql->db()->table( 'users' )->where( $field, $value )->first(); } }

UserModel