Laravel 设计模式:Repository + Service 实战

前期准备

Repository

app/Repositories/UserRepository.php

<?php

namespace App\Repositories;

interface UserRepository
{
    public function create ( $attributes );
}

app/Repositories/Eloquent/Users.php

<?php

namespace App\Repositories\Eloquent;

use App\Models\User;
use App\Repositories\UserRepository;

class Users implements UserRepository
{
    protected $user;

    public function __construct ( User $user )
    {
        $this->user = $user;
    }

    public function create ( $attributes )
    {
        $user = $this->user->create ( $attributes );

        return $user;
    }
}

接下来,我们要把 UserRepository 和 Users 绑定到服务提供者:

我们可以使用以下命令快速生成服务提供者:

php artisan make:provider RepositoryServiceProvider

执行后您将会在 app/Providers 文件夹下看见 RepositoryServiceProvider.php 文件。

绑定类

现在,我们要在 RepositoryServiceProvider.php 文件中绑定 UserRepository 和 Users 类:

App/Providers/RepositoryServiceProvider.php

public function register()
{
    $this->app->bind (
        'App\Repositories\UserRepository',
        'App\Repositories\Eloquent\Users'
    );
}

最后,我们把 RepositoryServiceProvider 类添加到 config/app.php 文件中:

config/app.php

return [
    .
    .
    .
    'providers' => [
        .
        .
        .
        App\Providers\RepositoryServiceProvider::class,
    ],
    .
    .
    .
]

相关链接:博客:使用 Repository 设计模式封装通用的 CURD 操作

Service

app/Services/UserService.php

<?php

namespace App\Services;

use App\Repositories\UserRepository;
use Illuminate\Auth\Events\Registered;

class UserService
{
    protected $users;

    public function __construct ( UserRepository $users )
    {
        $this->users = $users;
    }

    public function createUser ( $request )
    {
        $user = $this->users->create($request->all());
        event ( new Registered($user) );

        return $user;
    }
}

您也可以根据您的实际情况进行更改。

快速开始

我们可以运行以下命令快速生成控制器:

php artisan make:controller RegisterController

您将在 app/Http/Controllers 文件夹下看见 RegisterController.php 文件。

接下来,我们在 RegisterController.php 文件中添加以下内容:

app/Http/Controllers/RegisterController.php

<?php

namespace App\Http\Controllers;

use App\Http\Resources\UserResouce;
use App\Services\UserService;
use Illuminate\Http\Request;

class RegisterController extends Controller
{
    public function store ( Request $request, UserService $service )
    {
        $user = $service->createUser($request);

        return new UserResouce($user);
    }
}

执行以下命令快速生成 UserResouce 类:

php artisan make:resource UserResource

最后,把 RegisterController 添加到路由,如下所示:

routes/api.php

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::post ( 'register', 'RegisterController@store' );

测试环节

在测试开始之前,我们要先检查细节:

  • app/Providers/RouteServiceProvider.php 文件中的第 29 行是否取消注释
  • .env 文件中的数据库配置是否正确

迁移数据库

如果要迁移数据库,您可以运行以下命令:

php artisan migrate

用户注册

我这里用 postman模拟用户注册,您也可以选择您熟悉的软件。

参数 说明
name 名称
email 邮箱
password 密码

Laravel 设计模式:Repository + Service 项目实战

总结

您可以根据您的实际情况进行增加/更改/删除。

如果想要做到更好,您可以稍加改进。

发挥的想象力,让您的程序代码变得更简洁、更优雅。

本作品采用《CC 协议》,转载必须注明作者和本文链接
站在巨人的肩上。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 23

app/Repositories/Eloquent/Users.php内容 ??

2个月前 评论
laradocs (楼主) 2个月前
laradocs (楼主) 2个月前

不太喜欢用叫 service 一个类一个功能的话 service 容易把好多功能写一起 然后又成一堆代码了

2个月前 评论
laradocs

@阿凡 项目大点的话,可以把 Service 再细分。

2个月前 评论

service细分 不同人不同理解 这个人说还应该在A service 另外一个说应该新建B service

2个月前 评论
laradocs (楼主) 2个月前

文章写的真不错 gkd
期待更新更多精品好文
(刚刚号号被盗了,不是我评论的)

2个月前 评论
public function register()
{
    $this->app->bind (
        'App\Repositories\UserRepository',
        'App\Repositories\Eloquent\Users'
    );
}

多个的话,怎么绑定法?

话说你这个写法怎么不变,接口最好加上接口,不然看不清。

2个月前 评论

Mark,谢谢!辛苦了,学习去

2个月前 评论
朕略显ぼうっと萌

不实用

2个月前 评论
laradocs (楼主) 2个月前
黑将军

之前记得在哪篇帖子里看过,好像站长还是超哥写的,并不太支持repository模式 :joy:

2个月前 评论
laradocs

@黑将军 因为 Repository 是没有编码标准的,怎么爽怎么来:joy:

2个月前 评论

终于等到你了,赞

2个月前 评论

终于知道为什么都说 Laravel 框架又笨重又蜗牛了。
可能是因为它太“优雅”了。
:joy:

1个月前 评论
laradocs (楼主) 1个月前

如何测试

1个月前 评论
laradocs (楼主) 1个月前

UserService类的构造函数中注入的是接口类吗,我一般都是注入user类啊。

1个月前 评论
小李世界 1个月前

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