2017-05-06 1 views
3

Ich arbeite in meinem Laravel 5.4 Projekt mit der Repository Pattern (ich bin ziemlich neu zu diesem Muster). Ich habe rot viel über diese auf dem Netz, aber ich habe noch zwei wichtige Fragen:Laravel Repository Muster Erklärung

> Frage 1:

Stellen verwende ich Laravel ORM Eloquent und ich habe eine Schnittstelle, die wie folgt aussieht:

<?php 

namespace App\Repositories\User; 

interface UserRepoInterface 
{ 
    /** 
    * @param array $user 
    */ 
    public function update(array $request, User $user); 
} 

Sie sehen, dass ich das eloquent User Modell wie ein Parameter angegeben haben.

Die eloquent Implementierung sieht wie folgt aus:

public function update(array $request, User $user) 
{ 
    $user->name    = $request['name']; 
    $user->last_name  = $request['last_name']; 
    $user->email   = $request['email']; 
    $toUpdate->save(); 
} 

Also meine Frage:

Ist es falsch, die eloquent User Modell in meiner Schnittstelle zu codieren? In vielen Beispielen im Web sehe ich Leute, die das tun, aber was, wenn ich die eloquente Implementierung mit einer dateibasierten Implementierung austauschen möchte? Das ist ein Problem, weil ich ein User Modell an die Update-Methode übergeben muss!

Was ist die Lösung für dieses Problem sollte ich nur $user anstelle von User $user deklarieren?

> Frage 2:

Wie soll ich Paginierung umgehen?

Zum Beispiel in meinem eloquent UserRepository Ich habe eine Methode, die wie folgt aussieht:

public function index() 
{ 
    return User::orderBy('name', 'asc') 
     ->withCount('messages') 
     ->with('corporation') 
     ->paginate(10); 
} 

dies falsch ist? Sollte ich nur in meinem Controller paginieren?

Eine gute Erklärung würde mir sehr helfen.

Antwort

2

Frage 1

Laravel verwendet Active als Muster auf seiner Modelle + Datenzugriffsschicht.

Dieses Muster hat zum Ziel, die Dinge einfacher und schneller zu machen. Wenn Sie ein Repository-Muster verwenden, laufen Sie davon weg.

Um das Repository-Muster real zu verwenden, müssten Sie Datenübertragungsobjekte, DAT (in Java nennen sie es POJO) erstellen. Und dann, verwenden Sie die beredte Entität nur als Entity Manager.

POPO

class User { 

    private $id; 
    private $a; 

    public setId ($id) { $this->id = $id; } 
    public getId() { return $this->id; } 

    public setA ($a) { $this->a = $a; } 
    public getA() { return $this->a; } 
} 

Entity-Manager

class UserEloquent extends Eloquent { 
    protected $_table = 'user'; 
} 

Repository

class EloquentUserRepository implements UserReposistory { 
    private $em; 

    public __constructor (UserEloquent $em) { $this->em = $em; } 

    public update (User $dat) { 
    $user = $em->find($dat->getId()); 
    $user->a = $dat->getA(); 
    $user->save(); 
    } 
} 

Können Sie sehen, wie ausführlich wäre es? Wenn Sie diesen Ansatz wirklich verwenden möchten, empfehle ich Ihnen, Doctrine zu verwenden.

Aber wenn Sie ActiveRecord wie es ist verwenden möchten, empfehle ich Ihnen, einige Ruby on Rails Projekte zu sehen! Sie sind wirklich gut in diesem Muster :)

Nun, was ich wirklich denke: machen, was gut für das Projekt ist. Machen Sie es einfach, denken Sie mit Ihrem Team und erstellen Sie die Best Practices für Sie. Benutze nicht immer das gleiche Muster, weil dir jemand gesagt hat.

Wenn das Projekt klein und schnell ist, verwenden Sie, was das Framework Ihnen gibt (ich sage nicht zu entspannen und schlechten Code zu machen). Wenn es ein großes Projekt mit vielen Entwicklern im Team ist und Sie wissen, dass Sie eventuell Ihre Datenzugriffsschicht ändern möchten, denken Sie über das Repository-Muster nach.

Natürlich können wir manchmal falsche Architekturentscheidungen treffen, aber so lernen wir! Und halten Sie über Muster zu lesen, ich glaube, Sie einen guten Weg folgen ein großer Architekt zu sein :)

Frage 2

Es hängt davon ab, was Sie oben entschieden haben. Wenn Eloquent ActiveRecord so verwendet, wie es ist, spielt es keine Rolle, wo es aufgerufen wird (Controller oder irgendeine Mittelklasse). Folgen Sie einfach einem Muster. Wenn Sie den Controller immer rufen Sie es in Controller. Andernfalls werden Sie in Ihrem Code verloren gehen.

Mit Repository, denke ich, innerhalb des Repository ist es in Ordnung :)