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

翻译 Summer ⋅ 于 1个月前 ⋅ 最后回复由 Jourdon 1周前 ⋅ 1080 阅读 ⋅ 原文地址
这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍

file

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

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

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

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

overtrue 翻译于 1个月前

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

<?php

namespace App;

class User {

  protected $appends = [
    'url'
  ];

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

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

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

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

overtrue 翻译于 1个月前

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>
overtrue 翻译于 1个月前

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

overtrue 翻译于 1个月前

查看其他 1 个版本

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

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


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

本帖已被设为精华帖!
回复数量: 6
  • terranc 寻靠谱的远程开发团队
    1个月前

    很值得学习的方式

  • dinghua
    1个月前

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

  • 会飞的猪
    1个月前

    学习

  • 839891627 6
    1个月前

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

  • yourself
    3周前

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

  • Jourdon
    3周前

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

暂无评论~~

  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!