2017-04-24 1 views
0

J'ai lu quelques articles sur le modèle de dépôt et je veux savoir la raison pour laquelle le constructeur est nécessaire lorsque je peux appeler directement le modèle et retourner les données? Je pense aussi que Book::all(); est moins de code que $this->model->all(). Est-ce juste une bonne pratique ou un but?Laravel Repository modèle

class BookRepository implements RepositoryInterface { 

    private $model; 

    public function __construct(Book $model) 
    { 
     $this->model = $model; 
    } 

    public function index() 
    { 
     return $this->model->all(); 
    } 
} 

et

class BookRepository implements RepositoryInterface { 

    public function index() 
    { 
     return Book::all(); 
    } 
} 

Répondre

1

la raison principale est l'inversion de contrôle, laissant essentiellement l'application de déterminer ce qui doit être fourni pour remplir cette Depe ndency. La raison pour laquelle cela est important est que, dans le cas où vous décidez de refactoriser ce code, vous pouvez simplement dire à Laravel de charger une implémentation différente. Aucun code n'a besoin d'être modifié dans le référentiel lui-même. Ceci conduit cependant à l'idée de ne pas utiliser de classes directement, et d'utiliser des interfaces à la place pour déclarer vos dépendances. De cette façon, toute implémentation peut être permutée et votre code reste lisible.

class BookRepository { 

    public function __construct(BookInterface $book) 
    { 
     $this->book = $book; 
    } 

} 

Maintenant, votre dépôt ne se soucie pas vraiment de la classe réelle, juste qu'il implémente l'interface livre qui applique un ensemble de méthodes définir. Un exemple de cet avantage est que si vous utilisez, par exemple, MySQL comme base de données pour votre livre mais passez à Postgres, vous devrez peut-être modifier de manière significative le code sous-jacent, mais conserver les deux implémentations pour des raisons héritées. Vous pouvez facilement dire à Laravel de charger votre classe standard Book, ou votre nouvelle classe PostgresBook car les deux implémentent toujours le BookInterface.

Votre référentiel n'a pas besoin d'être modifié. Juste ajouter une liaison et vous êtes bon.

Un autre exemple plus direct est si vous avez décidé de passer d'Éloquent à ActiveRecord.

0

deux fonctionnera, mais si pour une raison quelconque vous voulez changer la classe de modèle [Livre] avec un autre modèle, par exemple [MyBook] dans ce cas, vous changerez seul le paramètre constructeur, toutes les fonctions qui utilisent [livre]

public function __construct(MyBook $model) 
{ 
    $this->model = $model; 
}