🎉 Acceso anticipado Black Friday: Hasta un 80% de descuento en nuestros cursos

6d: 12h: 58m:32s'
DANIEL MA
DANIEL MA
Laravel
Comparte:

Repositorios

Hola a todos. 
Estoy realizando un proyecto mediano/grande, en el que implemento el patrón Repository. 
Me encuentro con la necesidad de acceder a varios repositorios desde un mismo controlador.  
En este caso, es correcto realizar la inyección de dependencias de los repositorios que necesito desde el constructor del controlador? o en caso de necesitarlo desde el método correspondiente? 
Gracias
Jorge Davila
Jorge Davila (838 xp)
Si vas a utilizarlo mas de una vez puedes inyectarlos en el constructor, caso contrario deberias hacerlo en el metodo. Otra opcion seria crear un Facade que funcione como un "proxy" para crear una instancia del metodo que necesitas.No explicare lo que es un facade ya que hay varios videos de eso pero mas o menos lo que harias para crear el "proxy" seria algo asi:

class RepositoryFacade{
    public function __call($name,$params){
       if($this->isValidRepository($name)){
         return $this->getRepositoryInstance($name,$params);
       }
     }   
    protected function isValidRepository($name){
        /*tu logica para validar los repositorios aqui;*/
    }

   protected function getRepositoryInstance($repository,$params)
   { 
       $path=$path_to_repos.$repository;
       if(class_exists($path)){    
           return new $repository($params);       
       }  
       return ;
   }

}
Por lo tanto en tu facade podrias encadenar metodos asi:

\Repository::Users()->store($data);
Este segmento del codigo te devolveria una instancia del repository Users si existe el archivo Users en donde sea que estas apuntando:
\Repository::Users();

Y dentro de dicha clase tienes el metodo store,el cual puedes encadenar asi de facil. Es una forma algo confusa al principio pero te sirve para evitar hacer tanto binding en tu service provider. Puedes desarrollar cualquier otra logica para saber si existen los repositorios pero el usar el metodo magico __call es uno de mis favoritos ya que puedes llamar al metodo directamente en el facade mientras no exista dicho metodo y dentro de dicho metodo magico puedes resolver lo que deseas hacer.
Espero que te sea de utilidad.
DANIEL MA
DANIEL MA (66 xp)
Jorge, gracias por tu respuesta. En principio quisiera saber como modelar mi estructura de modelos conjuntamente con sus clases repository, cuando realizo varias conexiones diferentes (en este caso estoy usando mongodb). La clase RepositoryFacade quedaría dentro de la carpeta App\Repositories?