【发布时间】:2018-11-25 19:31:30
【问题描述】:
我希望你能阅读这篇文章并以非常明智的方式向我解释。我真的很感激。我知道这很多,但还是谢谢你。
假设我有一个 PostController 控制器和一个 post 模型。以下是我如何编写代码的场景。
1) 我可以在控制器中有一个构造函数并在那里注入 Post 模型。像这样:
class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
$post;
public function __construct(Post $post){
$this->post = $post;
}
public function show($id){
return $this->post->find($id);
}
2)我可以直接在一个函数(显示函数)中编写Post模型。
class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function show($id){
return Post::find($id);
}
3) 我可以有一个存储库类来扩展我的 eloquent Post 模型并将其注入到构造函数中。
class PostRepository extends Post{
}
class PostController extends Controller{
protected $post;
public function __construct(PostRepository $post){
$this->postRepo = $post;
}
public function show($id){
return $this->postRepo->find($id);
}
}
4) 我可以不用注入直接使用 postRepository。
class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function show($id){
return PostRepository::find($id);
}
我希望您了解所有这些示例。让我们谈谈我的问题以及我如何看待它。在我开始讲话之前,我想让你知道我希望我的代码是可测试的并且写得很好。
问题 1) 假设我使用第二个示例。我在那里直接访问 Post 模型。它是可测试的,因为 laravel 提供了一种模拟 eloquent 模型的方法。为什么这是不好的方法?我知道这很糟糕,我只是不知道为什么,因为我仍然可以模拟 eloquent 并对其进行测试。
问题 2) 第二个例子和第一个例子有什么区别?如果我可以测试它并模拟一个雄辩的模型,如果它可以在函数中直接访问,那为什么还要将它注入到构造函数中?
问题 3)假设我不使用存储库模式。创建存储库类并不意味着使用存储库模式。存储库模式是在使用接口时可以交换(例如从 eloquent 到其他 ORM)。假设我一直都知道我只会使用 eloquent,并且我不想将我的代码与框架本身分离。那么问题是为什么要使用 Repository Classes,如第三个和第四个示例所示?我问这个是因为人们说最好将复杂的逻辑放在存储库中而不是模型中。
问题 4) 第三个和第四个例子有什么区别?我仍然可以测试第四个示例。为什么要在构造函数中注入 PostRepository?
【问题讨论】: