Laravel Url 使用指南 4-2 使用 Trait 複用 URL 函式

心智極客發表於2020-01-08

原文

在上一講中,雖然介紹了 urlrouteaction 等方法來獲取對應的 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 協議》,轉載必須註明作者和本文連結

相關文章