在 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