在 Laravel 应用程序中拥有数十个甚至数百个视图并不罕见。很快就会对视图中使用的路由管理失控。能够想象若是你在视图中作了多少这样的事情。php
<a href="{{ route('users.show', ['id' => $user->id]) }}">{{ $user->name }}</a>
若是想对路由名称或者默认查询参数值进行修改,就须要在整个应用中进行大量的字符串替换操做,可是这会带来重复性的工做量,同时也可能会漏掉一些地方。html
那咱们能够作些什么来更好的处理这个问题呢?下面有两种实现方式。app
// app/Models/User.php <?php namespace App\Models; class User { protected $appends = [ 'url' ]; public function getUrlAttribute() { return route('users.show', $this); } }
而后在视图中就能够这样使用this
<a href="{{ $user->url }}">{{ $user->name }}</a>
感受写的很干净,是吧?但对于高级开发人员,你可能但愿采用下一种方法。url
咋一看你可能会觉的比较眼熟,是的,这里咱们定义一个url属性,但与通常写法不一样的是是咱们会返回一个 presenter
实例。spa
// app/Models/User.php <?php namespace App\Models; use App\Presenters\User\UrlPresenter; class User { protected $appends = [ 'url' ]; public function getUrlAttribute() { return new UrlPresenter($this); } }
// app/Presenters/User/UrlPresenter.php <?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); } }
而后就能够这样使用code
<a href="{{ $user->url->show }}">{{ $user->name }}</a>
如上,如今的视图并不关心咱们如何肯定URL,只是返回一个URL便可。 这样作的好处在于,你修改视图中的任何路由,只需编辑两个文件,而不是数百个。htm