Laravel Eloquent 小技巧:生成模型链接
77

file

在我们的 Laravel 应用中,有几十甚至几百个视图文件再正常不过了。 在这些文件中我们需要各种用到路由地址的地方,回想一下你已经像下面这样写过多少次了:

<a href="{{ route('users.show', $user) }}">{{ $user->name }}</a>

当我们需要对某个路由进行修改的时候,比如改成使用路由别名,或者添加一个参数,你很快就会发现你不得不使用一种高风险的操作:批量替换。

那有没有办法更科学的来解决这个痛点呢?这里介绍两种办法。

只针对 Eloquent 模型的简单改进方式

<?php

namespace App;

class User {

  protected $appends = [
    'url'
  ];

  public function getUrlAttribute()
  {
    return route('users.show', $this);
  }
}

然后你的视图文件就可以这样写了:

<a href="{{ $user->url }}">{{ $user->name }}</a>

怎么样,是不是非常的简洁明了?如果你是一个高级开发者,你也许会对下面一种用法更感兴趣。

Eloquent 模型与 URL Presenter 搭配使用

乍一看,与上面的用法基本差不多,只是属性访问器返回值变成了一个 Presenter 对象。

<?php

namespace App;

use App\Presenters\User\UrlPresenter;

class User {

  protected $appends = [
    'url'
  ];

  public function getUrlAttribute()
  {
    return new UrlPresenter($this);
  }
}
<?php

namespace App\Presenters\User;

use App\User;

class UrlPresenter {

    protected $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function __get($key)
    {
        if(method_exists($this, $key))
        {
            return $this->$key();
        }

        return $this->$key;
    }

    public function delete()
    {
        return route('users.delete', $this->user);
    }

    public function edit()
    {
        return route('users.edit', $this->user);
    }

    public function show()
    {
        return route('users.show', $this->user);
    }

    public function update()
    {
        return route('users.update', $this->user);
    }
}

然后你就可以这样在视图中使用了:

<a href="{{ $user->url->show }}">{{ $user->name }}</a>

无论你使用以上哪种方式,视图都不必关心 URL 的生成方式,只是简单的输出模型的 URL。它的美妙之处在于,当你需要修改 URL 的时候,你仅仅只需要修改两个文件,而不是原来的几十上百个文件。


Practice makes perfect.

原文地址:https://laravel-news.com/leverage-eloque...

译文地址:https://laravel-china.org/topics/10239/l...

本帖已被设为精华帖!
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 7

很值得学习的方式

4个月前

可以做一些改进,自动拿 model 的名字来拼装url,这样就不需要每个 model 写一次

4个月前

学习

4个月前

感觉laravel是越用越复杂 已经不考虑性能,肆无忌惮了。。。。

4个月前

如果url还需要别的参数,一样需要批量替换的。毕竟有些参数是在前端处理的。

4个月前
Jourdon

使用上是越来越简单了,但是性能真是一个大问题,也是一直被诟病的一个地方。

4个月前
wujunze

@839891627
@Jourdon Laravel + Swoole可以解决很大的性能问题

2个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!