2015-05-26 18 views
9

Propel verwendet Peer Klassen und Doktrin verwendet Table Klassen als eine Möglichkeit, entsprechende Objekte und Objekteigenschaften zu manipulieren, ohne das eigentliche Objekt mit static Methoden zu verschmutzen.Laravel (Eloquent) Tabelle || Peer-Entsprechung

Nach flüchtigen Blick des Laravel (eloquent) Docs, sah ich nichts, was eloquent bietet für die gleiche Funktionalität wie Peer oder Table. Meine Frage ist, bietet Laravel (oder eloquent) einen Namespace für solche Klassen, oder verwende ich einfach Table und lassen Autoloader kümmern sich um den Rest?

// Example use of a table class in doctrine 1.2 
$user = UserTable::getInstance()->findById(1); 

- Update 1-

Layman Beispiel dafür, wie eine Lehre Tabellenklasse verwendet werden können:

class UserTable 
{ 
    public static function getInstance() 
    { 
     return Doctrine_Core::getTable('User'); 
    } 

    public function linkFoo($userId, array $foos) 
    { 
     $user = $this->findById($userId); 

     foreach ($foos as $foo) { 

      $user->foo = $foo; 

      $user->save(); 
     } 
    } 
} 

// SomeController.php 
executeSaveFoo() 
{ 
    UserTable::getInstance()->linkFoo($this->getUser(), array('foo1', 'foo2')); 
} 

Der Zweck der Lehre Tabellenklasse ist eine api zu schaffen für Aktionen gegen entsprechende Objekte, die nicht in der Steuerung sein sollten, wird im obigen Beispiel die Klasse linkFoo die bereitgestellten foos mit dem jeweiligen Benutzerobjekt verknüpfen.

Ich empfinde die Trennung zwischen Objekten und "Tisch" -Klassen als wichtig, da ein Objekt nicht wissen sollte, wie es sich selbst instantiiert oder hydratisiert.

+0

Können Sie erklären, was über dem Beispiel erreicht oder was genau es tut? – aethergy

+1

Mit Eloquent haben Sie nur eine Klasse pro Modell (und normalerweise eine Datenbanktabelle), aber Sie müssen sie nicht mit irgendetwas "verschmutzen". Bitte lesen Sie die Dokumentation und/oder klären Sie, was Ihr Problem ist. – lukasgeiter

+0

Ich sagte nicht verschmutzen es mit "irgendetwas", ich war spezifisch über "statische" Methoden. Ist es sinnvoll, das Objekt gemäß obigem Beispiel an sich selbst zu übergeben? –

Antwort

5

Wie bereits erwähnt, gibt es mehr als einen Weg, um die Aufgabe zu erledigen, aber hier ist ein kurzes Beispiel mit Befehlen.

-Controller

namespace App\Http\Controllers; 

//... 
use App\Http\Requests\UpdateUserRequest; 
use App\Commands\UpdateUser; 
use App\User; 
//... 

class UserController extends Controller { 

/** 
* Update the specified resource in storage. 
* 
* @param int $id 
* @return Response 
*/ 
public function update(UpdateUserRequest $request, $id) 
{ 
    //gather request data 
    $data = $request->all(); 

    //retrieve user 
    $user= User::findOrFail($id); 

    //update user 
    $updateUser = \Bus::dispatch(
         new UpdateUser($user, $data) 
        ); 

    //check if update was successful 
    if($updateUser) 
    { 
     //update successful 
     return redirect('/route/here')->with('message', 'User updated successfully'); 
    } 
    else 
    { 
     //else redirect back with error message 
     return redirect()->back()->with('error', 'Error updating user'); 
    } 
} 
} 

Die UpdateUserRequest Klasse Validierung umgehen würde.

Befehl

namespace App\Commands; 

use App\Commands\Command; 

use Illuminate\Contracts\Bus\SelfHandling; 

class UpdateUser extends Command implements SelfHandling { 

    protected $user, $data; 

    /** 
    * Create a new command instance. 
    */ 
    public function __construct($user, $data) 
    { 
     $this->user= $user; 
     $this->data = $data; 
    } 

    /** 
    * Execute the command. 
    */ 
    public function handle() 
    { 
     //assign first name 
     $this->user->first_name = $this->data['first_name']; 

     //assign last name 
     $this->user->last_name = $this->data['last_name']; 

     //assign email address 
     $this->user->email = $this->data['email']; 

     //update user 
     if($this->user->update()) 
     { 
      //updated successfully, return true 
      return true; 
     } 
     else 
     { 
      //else return false 
      return false; 
     } 
    } 

}