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



我有一个孤立的类文件,该文件位于纤细的控制器或周期之外:

class UserModel
{

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

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

问题:

1)如何访问此类的苗条容器?

2)我在文档中没有看到这样的示例,是应该避免的东西吗?我是否应该避免从外部纤细控制器访问苗条的容器?

我在Doc

中没有看到这样的示例

那可能是因为容器是Slim-> pimple的依赖性

我是否应该避免从外部纤细控制器访问苗条的容器?

no,实际上该容器应用于构造所有对象

我如何访问此类的纤细容器

您不应访问班级中的di-container。相反,容器应在构造函数中注入所需的实例。

所以首先,当您尚未完成此操作时,将DbSql添加到容器中:

$app = SlimApp();
$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

$userModel = $container['UserModel'];
$user = $userModel->getSingleUser('name', 'jmattheis');

相关内容

  • 没有找到相关文章

最新更新