CodeIgniter 4 \Config\Service::my-instance-method returns NULL on true $getShared

CodeIgniter 4 \Config\Service::my-instance-method returns NULL on true $getShared

Config\Services 是一个 class ,旨在减少单例上的大量代码开发。不幸的是我犯了一个错误。

当从 getShared 获取 repositoryFacade 时,

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是基础设施层的具体class,其职责是让RepositoryFacade 执行 ORM,不接触域层。

getShared 是不是一点用都没有?删除 TRUE 值后没有错误。

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

这行代码逻辑错误

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

将其更改为以下效果完美。

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

可以做多个RepositoryFacade class个实例服务于Repository实例,比如UserRepository, ProductRepository,这样我们就不需要获取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);