在上一講中,雖然介紹了 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 協議》,轉載必須註明作者和本文連結