Using dependency injection over laravel facades

后端 未结 6 1373
鱼传尺愫
鱼传尺愫 2021-01-30 16:48

I have read a number of sources that hint that laravel facade\'s ultimately exist for convenience and that these classes should instead be injected to allow loose coupling. Even

6条回答
  •  误落风尘
    2021-01-30 17:05

    This is one of the benefits of constructor injection - it becomes obvious when you class is doing to much, because the constructor parameters grow too large.

    1st thing to do is split up controllers that have too many responsibilities.

    Say you have a page controller:

    Class PageController
    {
    
        public function __construct(
            Request $request,
            ClientRepositoryInterface $clientrepo,
            StaffRepositortInterface $staffRepo
            )
        {
    
         $this->clientRepository = $clientRepo;
         //etc etc
    
        }
    
        public function aboutAction()
        {
            $teamMembers = $this->staffRepository->getAll();
            //render view
        }
    
        public function allClientsAction()
        {
            $clients = $this->clientRepository->getAll();
            //render view
        }
    
        public function addClientAction(Request $request, Validator $validator)
        {
            $this->clientRepository->createFromArray($request->all() $validator);
            //do stuff
        }
    }
    

    This is a prime candidate for splitting into two controllers, ClientController and AboutController.

    Once you have done that, if you still have too many* dependencies, its time to look for what i will call indirect dependancies (because i cant think of the proper name for them!) - dependencies that are not directly used by the dependant class, but instead passed on to another dependency.

    An example of this is addClientAction - it requires a request and a validator, just to pass them to the clientRepostory.

    We can re factor by creating a new class specifically for creating clients from requests, thus reducing our dependencies, and simplifying both the controller and the repository:

    //think of a better name!
    Class ClientCreator 
    {
        public function __construct(Request $request, validator $validator){}
    
        public function getClient(){}
        public function isValid(){}
        public function getErrors(){}
    }
    

    Our method now becomes:

    public function addClientAction(ClientCreator $creator)
    { 
         if($creator->isValid()){
             $this->clientRepository->add($creator->getClient());
         }else{
             //handle errors
         }
    }
    

    There is no hard and fast rule as to what number of dependencies are too many. The good news is if you have built your app using loose-coupling, re-factoring is relatively simple.

    I would much much rather see a constructor with 6 or 7 dependencies than a parameterless one and a bunch of static calls hidden throughout the methods

提交回复
热议问题