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

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 的时候,你仅仅只需要修改两个文件,而不是原来的几十上百个文件。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

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

译文地址:https://learnku.com/laravel/t/10239/lara...

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7

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

5年前 评论

很值得学习的方式

5年前 评论

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

5年前 评论

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

5年前 评论
yourself

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

5年前 评论
Jourdon

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

5年前 评论

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

5年前 评论

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