Laravel Url 使用指南 4-2 使用 Trait 复用 URL 函数

原文

在上一讲中,虽然介绍了 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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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