文档中说: Repository 是通过 UserRepository 注入的,Repository 在哪呢?

难道不是UserRepository通过构造方法注入到UserController 这个类中的嘛?“因为 Repository 是通过 UserRepository 注入的” 是什么意思?

<?php

namespace App\Http\Controllers;

use App\User;
use App\Repositories\UserRepository;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * 用户存储库的实现。
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * 创建新的控制器实例。
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    /**
     * 显示指定用户的 profile。
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        $user = $this->users->find($id);

        return view('user.profile', ['user' => $user]);
    }
}

在这个例子中,控制器 UserController 需要从数据源中获取 users 。因此,我们要注入可以获取 users 的服务。在这种情况下,UserRepository 可能是使用 Eloquent 从数据库中获取 user 信息。因为 Repository 是通过 UserRepository 注入的,所以我们可以轻易地将其切换为另一个实现。这种注入方式的便利之处还体现在当我们为应用编写测试时,我们还可以轻松地「模拟」或创建 UserRepository 的虚拟实现。

桃知夭夭
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

通过构造方法实例化UserRepository 的话,代码的耦合度就提高了。注入能减少耦合

5年前 评论

因为 Repository 是通过 UserRepository 注入的

Repository 意为资料库。是针对复杂程序抽象出的一层概念(对于简单的程序,Model 就是代表存储在 DB 中的资料库)。 用于方便切换数据来源,UserRepository 指具体的用户资料库,可以是抽象类或接口。

Repository 文件所在的目录为 App/Repositories

所以我们可以轻易地将其切换为另一个实现。

我们对 UserRepository 进行实现。 UserDBRepository 是从 MySQL 中获取用户数据,UserMongoRepository 从来 MongoDB 的后去用户数据的。 切换数据来源时只需在服务容器中绑定对应实现类即可。

这种注入方式的便利之处还体现在当我们为应用编写测试时,我们还可以轻松地「模拟」或创建 UserRepository 的虚拟实现。

通过类 mockery/mockery 模拟程序进行调试。

参考:
Laravel 的中大型專案架構 | 點燈坊

4年前 评论

Repository 是一个概览,一个服务可以通过接口来定义行为,如何使用不同的类来实现这些行为 当测试的时候可以使用测试的实现,生产的时候可以使用生产的实现,但对服务调用者来说就是有一个Repository

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!