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);
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);