2015-05-26 7 views
9

Propel использует классы Peer, а доктрина использует классы Table как способ управления соответствующими объектами и объектами, без необходимости загрязнять фактический объект с помощью методов static.Laravel (Красноречивый) Таблица || Одноранговый эквивалент

После беглого взгляда на ларавельные (красноречивые) документы я не видел ничего такого, что красноречивый обеспечивает одинаковые Peer или Table как функциональность. Мой вопрос в том, делает ли laravel (или красноречивым) пространство имен для таких классов, или я просто использую Table и позволяю автозагрузчику заботиться обо всем остальном?

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

- Обновление 1 -

Лэйман пример того, как может быть использован класс доктрина таблицы:

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

Цель класса доктрины таблицы является предоставление API для действий против соответствующих объектов, которые не должны находиться в контроллере, в приведенном выше примере класс linkFoo свяжет предоставленные foos с соответствующим пользовательским объектом.

Я чувствую, что разделение между объектами и «табличными» классами важно, так как объект не должен знать, как создавать экземпляры и не увлажнять себя.

+0

Можете ли вы объяснить, что ваш пример выше выполняет или то, что именно он делает? – aethergy

+1

С Eloquent у вас есть только один класс для каждой модели (и обычно таблица базы данных), но вам не нужно «загрязнять» ее чем угодно. Пожалуйста, ознакомьтесь с документацией и/или уточните, в чем проблема. – lukasgeiter

+0

Я не сказал, загрязняю его «ничего», я был конкретно о «статических» методах. Имеет ли смысл передать объект себе по приведенному выше примеру? –

ответ

5

Как уже упоминалось ранее, существует несколько способов выполнить задачу, но здесь приведен краткий пример использования команд.

Контроллер

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

UpdateUserRequest класс будет обрабатывать проверки.

Команда

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

} 
Смежные вопросы