Laravel 5 如何创建一个使用类的外观,该类在Laravel中需要几个存储库?

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

我使用Laravel已经快一年了,但我对创建自己的包和使用合同、存储库、外观等方面非常陌生,所以请耐心等待

如果我在我的服务提供商中正确注册了facade,我在理解上有问题。以下是上下文(假设名称空间和导入已正确完成。我不包括它们,这样就不会太复杂):

我想创建一个名为AdminServices的facade来访问名为AdminServices的类:

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的任何确认):