Laravel Url 使用指南 4-2 使用 Trait 复用 URL 函数
在上一讲中,虽然介绍了 url
、route
、action
等方法来获取对应的 url,但是在实际使用的时候仍然不是很方便。例如:
<ol>
@foreach ($posts as $post)
<li><a href="{{ route('posts.show', $post) }}">
{{ $post->name }}
</a></li>
@endforeach
</ol>
这种方式有两个缺点:
- 对应的 url 可能在多个地方需要用到,每次都要重复编写代码
- 可读性差,不能一眼就看出是哪种类型的 url
因此,一种简单的方式是将其封装到模型中,可以用模型属性或者方法来进行封装。
使用方法封装 url
使用方法进行封装
// Post.php
public function link($params = []) : string
{
$params = array_unshift([$this->getRouteKey(), $params);
return route('posts.show', $params);
}
测试
<ol>
@foreach ($posts as $post)
<li><a href="{{ $post->link() }}">
{{ $post->name }}
</a></li>
@endforeach
</ol>
使用模型属性封装 url
使用模型属性进行封装
protected $appends = [
'url'
];
public function getUrlAttribute() : string
{
return route('users.show', $this);
}
测试
<ol>
@foreach ($posts as $post)
<li><a href="{{ $post->url }}">
{{ $post->name }}
</a></li>
@endforeach
</ol>
使用 Trait 管理 url
现在考虑让所有模型都支持该操作,思路很简单
<?php
namespace App\Traits;
trait UrlLink
{
public function showLink(array $params = [])
{
array_unshift($params, $this->getRouteKey());
return route("{$this->getTable()}.show", $params);
}
}
这里约定路由使用复数,即与数据库表名一致,因此可以通过 getTable()
方法获取路由的部分名称。
同理,其他类型的 url 也可以按照这种方式实现,完整代码如下
<?php
namespace App\Traits;
trait UrlLink
{
public function buildLink(string $name, array $params = []) : string
{
array_unshift($params, $this->getRouteKey());
return route("{$this->getTable()}.$name", $params);
}
public function showLink(array $params = []) : string
{
return $this->buildLink('show', $params);
}
public function editLink(array $params = []) : string
{
return $this->buildLink('edit', $params);
}
public function updateLink(array $params = []) : string
{
return $this->buildLink('update', $params);
}
public function deleteLink(array $params = []) : string
{
return $this->buildLink('destroy', $params);
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接