简化后的Eloquent 的 model 类我们可以称之为Eloquent Class,由于继承了Illuminate\Database\Eloquent\Model 类,所以Eloquent Class仍然有很多方法可以操作数据库。
Eloquent Class 代码结构如下:
namespace MyBlog;
use Illuminate\Database\Eloquent\Model;
/**
* MyBlog\User
*
*/
class User extends Model {
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name', 'email', 'password'];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = ['password', 'remember_token'];
}
public function index()
{
$users = User::where('age', '>', 20)
->orderBy('age')
->get();
return view('users.index', compact('users'));
}
数据库逻辑是获取 20 岁以上的用户。
在中大型项目中,会有几个问题 :
将数据库逻辑写在 controller,造成 controller 的肥大难以维护。
违反 SOLID 的单一职责原则 : 数据库逻辑不应该写在 controller。
controller 直接相依于model,使得我们无法对 controller 做单元测试。
比较好的方式是使用 repository :
将 model 依赖注入到 repository。
将数据库逻辑写在 repository。
将 repository 依赖注入到 service。
以此原则,我们看下,采用 Eloquent ORM 如何使用 Repository 模式。
UserRepository.php
namespace MyBlog\Repositories;
use Doctrine\Common\Collections\Collection;
use MyBlog\User;
class UserRepository
{
/** @var User 注入的User model */
protected $user;
/**
* UserRepository constructor.
* @param User $user
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* 返回年龄大于$age的用户
* @param integer $age
* @return Collection
*/
public function getAgeLargerThan($age)
{
return $this->user
->where('age', '>', $age)
->orderBy('age')
->get();
}
}
第 8 行
/** @var User 注入的User model */
protected $user;
/**
* UserRepository constructor.
* @param User $user
*/
public function __construct(User $user)
{
$this->user = $user;
}
将依赖的 User model 依赖注入到 UserRepository。
UserController.php
<?php
namespace App\Http\Controllers;
use App\Http\Requests;
use MyBlog\Repositories\UserRepository;
class UserController extends Controller
{
/** @var UserRepository 注入的UserRepository */
protected $userRepository;
/**
* UserController constructor.
*
* @param UserRepository $userRepository
*/
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$users = $this->userRepository
->getAgeLargerThan(20);
return view('users.index', compact('users'));
}
}
将依赖的 UserRepository 依赖注入到 UserController。
26行
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$users = $this->userRepository
->getAgeLargerThan(20);
return view('users.index', compact('users'));
}