我有一个孤立的类文件,它在一个超薄的控制器或循环之外:
class UserModel
{
public function getSingleUser( string $field, $value )
{
return ( new DbSql )->db()->table( 'users' )->where( $field, $value )->first();
}
}
我想通过访问也在slim容器中注册的此服务来替换DbSql类的实例化。
问题:
1)如何从这个类中访问slim容器?
2)我在文档中没有看到这样的例子,是否应该避免?我应该避免从超薄控制器外部进入细长容器吗?
答案 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