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 协议》,转载必须注明作者和本文链接
推荐文章: