CodeIgniter 4 \配置\服务::my-instance-method在$getShared为真时返回NULL

6l7fqoea  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(109)

Config\Services是一个类,用来减少在单例上的大量代码开发。不幸的是,我犯了一个错误。
当从getShared获取存储库外观时,

Services::repositoryFacade(Services::userRepository(), TRUE);

代码将失败并显示:

Config\Services::repositoryFacade(): Return value must be of type App\Domain\Core\IRepositoryFacade, null returned

以下代码已在app/Config/Service.php中设置

public static function repositoryFacade(IRepository $repository, bool $getShared = false): IRepositoryFacade{
    if ($getShared) {
        return self::getSharedInstance('resourceFacade');
    }

    return new RepositoryFacade($repository);
}

public static function userRepository(bool $getShared = true): IRepository
{
    if ($getShared) {
        return self::getSharedInstance('userRepository');
    }

    return new UserRepository(model(UserModel::class));
}

RepositoryFacade位于基础结构层,为IRepository域接口一一服务,而UserRepository是基础结构层的一个具体类,它的职责是让RepositoryFacade执行ORM,与域层没有任何接触。
getShared是不是一点用处都没有?当TRUE值被删除时不会出现错误。

Services::repositoryFacade(Services::userRepository());
nvbavucw

nvbavucw1#

这行代码在逻辑上是不正确的。

Services::repositoryFacade(Services::userRepository(), TRUE);

将其更改为下面的工作完美。

Services::repositoryFacade(Services::userRepository(TRUE));

这样就可以使多个RepositoryFacade类示例为Repository示例服务,如UserRepositoryProductRepository,从而我们不需要得到相同的RepositoryFacade示例。
UserRepository应该始终保持不变。因此,我们可以通过以下方式获取UserRepository的相同示例:

Services::userRepository(TRUE)

如果需要多次使用带有UserRepository的外观,只需

$facade = Services::repositoryFacade(Services::userRepository(TRUE));

// use multiple times with the facade 
$result = $facade->findById(5);
if (!empty($result)) $facade->delete(5);

相关问题