Laravel (Eloquent) Table ||同等学历
Laravel (Eloquent) Table || Peer equivalent
Propel 使用 Peer
classes,而 doctrine 使用 Table
classes 作为一种操作各个对象和对象属性的方式,而不必污染实际具有 static
方法的对象。
粗略浏览 laravel (eloquent) 文档后,我没有看到 eloquent 为相同的 Peer
或 [=16= 提供的任何内容] 喜欢的功能。我的问题是,laravel(或 eloquent)是否为此类 class 提供命名空间,还是我只使用 Table
并让自动加载器处理其余部分?
// Example use of a table class in doctrine 1.2
$user = UserTable::getInstance()->findById(1);
--更新一--
如何使用学说 table class 的外行示例:
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'));
}
原则 table class 的目的是为针对不应在控制器中的各个对象的操作提供 api,在上面的示例中 linkFoo
class 将 link 向相应的用户对象提供 foo。
我觉得对象和 'table' classes 之间的分离很重要,因为对象不应该知道如何实例化或水化自己。
如前所述,完成任务的方法不止一种,但这里有一个使用命令的简单示例。
控制器
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
class 将处理验证。
命令
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;
}
}
}
Propel 使用 Peer
classes,而 doctrine 使用 Table
classes 作为一种操作各个对象和对象属性的方式,而不必污染实际具有 static
方法的对象。
粗略浏览 laravel (eloquent) 文档后,我没有看到 eloquent 为相同的 Peer
或 [=16= 提供的任何内容] 喜欢的功能。我的问题是,laravel(或 eloquent)是否为此类 class 提供命名空间,还是我只使用 Table
并让自动加载器处理其余部分?
// Example use of a table class in doctrine 1.2
$user = UserTable::getInstance()->findById(1);
--更新一--
如何使用学说 table class 的外行示例:
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'));
}
原则 table class 的目的是为针对不应在控制器中的各个对象的操作提供 api,在上面的示例中 linkFoo
class 将 link 向相应的用户对象提供 foo。
我觉得对象和 'table' classes 之间的分离很重要,因为对象不应该知道如何实例化或水化自己。
如前所述,完成任务的方法不止一种,但这里有一个使用命令的简单示例。
控制器
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
class 将处理验证。
命令
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;
}
}
}