2015-05-26 29 views
9

Propel utilizza le classi Peer e la dottrina utilizza le classi Table come modo per manipolare i rispettivi oggetti e le proprietà dell'oggetto, senza dover inquinare l'oggetto reale con i metodi static.Tabella Laravel (Eloquent) || Peer equivalent

Dopo sguardo superficiale del laravel (eloquenti) documenti, non ho visto qualche cosa che eloquenti prevede la stessa Peer o Table come funzionalità. La mia domanda è, laravel (o eloquente) fornisce uno spazio dei nomi per tali classi, o devo semplicemente usare Table e lasciare che il caricatore automatico si occupi del resto?

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

- Aggiornamento 1-

Layman esempio di come può essere utilizzato una classe di tabella di dottrina:

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')); 
} 

Lo scopo della classe tavolo dottrina è quello di fornire un'API per azioni contro i rispettivi oggetti che non dovrebbero essere nel controller, nell'esempio sopra la classe linkFoo collegherà foos forniti al rispettivo oggetto utente.

Ritengo che la separazione tra gli oggetti e le classi "table" sia importante, poiché un oggetto non dovrebbe sapere come istanziare né idratarsi.

+0

Ci può spiegare che cosa il vostro esempio di cui sopra compie o che cosa esattamente si sta facendo? – aethergy

+1

Con Eloquent hai solo una classe per modello (e di solito una tabella di database) ma non devi "inquinarla" con niente. Si prega di leggere la documentazione e/o chiarire qual è il tuo problema. – lukasgeiter

+0

Non ho detto di inquinarlo con "nulla", ero specifico sui metodi "statici". Ha senso passare l'oggetto a se stesso secondo l'esempio sopra? –

risposta

5

Come accennato in precedenza, esiste più di un modo per eseguire l'operazione, ma ecco un rapido esempio che utilizza Comandi.

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'); 
    } 
} 
} 

La classe UpdateUserRequest sarebbe occupato di convalida.

Comando

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; 
     } 
    } 

} 
Problemi correlati