Laravel Url 使用指南 4-3 使用 Presenter 管理 url

原文

原理

从单一职责的角度来看,url 可由专门的类管理,模型将 url 的生成职责委托给专门的类,使用如下

$post->presenter()->show();

这种设计模式称之为委托模式,模型只需要关注结果,不需要关注 url 的具体生成过程。

实现

定义一个 UrlPresenter 类,用于管理 url 的生成

<?php

namespace App\Urls;

use Illuminate\Database\Eloquent\Model;

class UrlPresenter
{
    protected $model;

    public function __construct(Model $model)
    {
        $this->model = $model;
    }

    public function __get($key)
    {
        if(method_exists($this, $key))
        {
            return $this->$key();
        }

        return $this->$key;
    }

    public function link(string $name, array $params = []) : string
    {   
        array_unshift($params, $this->model->getRouteKey());

        return route("{$this->model->getTable()}.$name", $params);
    }

    public function show(array $params = []) : string
    {
        return $this->link('show', $params);
    }

    public function edit(array $params = []) : string
    {
        return $this->link('edit', $params);
    }

    public function update(array $params = []) : string
    {
        return $this->link('update', $params);
    }

    public function delete(array $params = []) : string
    {
        return $this->link('destroy', $params);
    }
}

在 Model 中定义委托关系

// Post.php
public function presenter()
{
    return new \App\Urls\UrlPresenter($this);
}

使用

$post = Post::first();
$post->presenter()->show();
$post->presenter()->show;

封装成 Trait

<?php

namespace App\Traits;

use App\Urls\UrlPresenter;

trait Presenterable
{
    public function presenter()
    {
        return new UrlPresenter($this);
    }
}

使用

// Post.php
use App\Traits\Presenterable;

class Post extends Model
{
    use Presenterable;
}

如果需要其他 Url,可以自定义 Presenter

<?php

namespace App\Urls;

class PostPresenter extends UrlPresenter
{
    public function markdown() 
    {
        return $this->link('markdown');
    }
}

使用

// Post.php
public function presenter()
{
    return new \App\Urls\PostPresenter($this);
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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