Laravel Eloquent 小技巧:生成模型链接
在我们的 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
本帖已被设为精华帖!
高认可度评论:
感觉laravel是越用越复杂 已经不考虑性能,肆无忌惮了。。。。
很值得学习的方式
可以做一些改进,自动拿 model 的名字来拼装url,这样就不需要每个 model 写一次
学习
感觉laravel是越用越复杂 已经不考虑性能,肆无忌惮了。。。。
如果url还需要别的参数,一样需要批量替换的。毕竟有些参数是在前端处理的。
使用上是越来越简单了,但是性能真是一个大问题,也是一直被诟病的一个地方。
@839891627
@Jourdon Laravel + Swoole可以解决很大的性能问题