Laravel 5 如何创建一个使用类的外观,该类在Laravel中需要几个存储库?
我使用Laravel已经快一年了,但我对创建自己的包和使用合同、存储库、外观等方面非常陌生,所以请耐心等待 如果我在我的服务提供商中正确注册了facade,我在理解上有问题。以下是上下文(假设名称空间和导入已正确完成。我不包括它们,这样就不会太复杂): 我想创建一个名为AdminServices的facade来访问名为AdminServices的类:Laravel 5 如何创建一个使用类的外观,该类在Laravel中需要几个存储库?,laravel-5,packages,facade,service-provider,contract,Laravel 5,Packages,Facade,Service Provider,Contract,我使用Laravel已经快一年了,但我对创建自己的包和使用合同、存储库、外观等方面非常陌生,所以请耐心等待 如果我在我的服务提供商中正确注册了facade,我在理解上有问题。以下是上下文(假设名称空间和导入已正确完成。我不包括它们,这样就不会太复杂): 我想创建一个名为AdminServices的facade来访问名为AdminServices的类: class AdminServices implements AdminServicesContract { private $check
class AdminServices implements AdminServicesContract
{
private $check;
public function __construct(CheckAdminContract $check)
{
$this->check = $check;
}
public function check()
{
return $this->check;
}
}
您会注意到这个类需要一个契约,CheckAdminContract。该契约在CheckAdmin类中实现。请注意,此类需要UserRepository:
class CheckAdmin implements CheckAdminContract
{
private $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function userIsAdmin(User $user)
{
return $user->roles()->whereAdmin()->count() > 0;
}
public function userIsAdminById($user_id)
{
$user = $this->userRepository->getById($user_id);
return $this->userIsAdmin($user);
}
public function userIsSuperAdmin(User $user)
{
return $user->roles()->whereSuperAdmin()->count() > 0;
}
public function userIsSuperAdminById($user_id)
{
$user = $this->userRepository->getById($user_id);
return $this->userIsSuperAdmin($user);
}
}
interface UserRepository
{
public function getById($user_id);
}
class EloquentUserRepository implements UserRepository
{
private $model;
public function __construct()
{
$this->model = new User;
}
public function getById($user_id)
{
return $this->model->findOrFail($user_id);
}
}
以下是UserRepository:
class CheckAdmin implements CheckAdminContract
{
private $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function userIsAdmin(User $user)
{
return $user->roles()->whereAdmin()->count() > 0;
}
public function userIsAdminById($user_id)
{
$user = $this->userRepository->getById($user_id);
return $this->userIsAdmin($user);
}
public function userIsSuperAdmin(User $user)
{
return $user->roles()->whereSuperAdmin()->count() > 0;
}
public function userIsSuperAdminById($user_id)
{
$user = $this->userRepository->getById($user_id);
return $this->userIsSuperAdmin($user);
}
}
interface UserRepository
{
public function getById($user_id);
}
class EloquentUserRepository implements UserRepository
{
private $model;
public function __construct()
{
$this->model = new User;
}
public function getById($user_id)
{
return $this->model->findOrFail($user_id);
}
}
下面是实现UserRepository的雄辩的TuserRepository:
class CheckAdmin implements CheckAdminContract
{
private $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function userIsAdmin(User $user)
{
return $user->roles()->whereAdmin()->count() > 0;
}
public function userIsAdminById($user_id)
{
$user = $this->userRepository->getById($user_id);
return $this->userIsAdmin($user);
}
public function userIsSuperAdmin(User $user)
{
return $user->roles()->whereSuperAdmin()->count() > 0;
}
public function userIsSuperAdminById($user_id)
{
$user = $this->userRepository->getById($user_id);
return $this->userIsSuperAdmin($user);
}
}
interface UserRepository
{
public function getById($user_id);
}
class EloquentUserRepository implements UserRepository
{
private $model;
public function __construct()
{
$this->model = new User;
}
public function getById($user_id)
{
return $this->model->findOrFail($user_id);
}
}
下面是我要注册的外观:
use Illuminate\Support\Facades\Facade;
class AdminServices extends Facade
{
protected static function getFacadeAccessor()
{
return 'admin-services';
}
}
以下是我在服务提供商中注册的内容(所有类都通过使用指令正确导入):
所以我的大问题是:
在注册facade访问器时,我真的必须显式地实例化所有存储库和契约实现吗?我已经在上面将它们注册为Singleton,所以在我天真的想法中,我相信再次实例化这些东西将使工作重新开始,如果我决定使用这些契约和存储库的不同实现,那么我将不得不多次更改它们,在我天真的头脑里,这又一次让我觉得我做错了什么
你能让我知道我在singleton中为facade访问器做的是否正确吗?你能建议一种你做过类似事情的方法,或者更好的方法吗
此外,如果您看到我没有正确地执行某些操作,或者我的代码编写得不是很好,请告诉我如何改进。再一次,我对这些主题非常陌生,但我觉得我对它们有足够的理解,可以适当地完成它们。但我真的很想得到一些反馈,这样我就不会一直做错事(如果我做错了)
另外,如果有更好的方法让我组织或者问这个问题,请再次告诉我,这样我就不会再犯同样的错误了
提前感谢您的帮助 我找到了自己问题的答案 在注册facade时,我需要在闭包中使用$app参数来创建CheckAdminContract(这完全消除了在这个特定服务提供商中对UserRepository的任何确认):