在 Laravel 應用程序中擁有數(shù)十個甚至數(shù)百個視圖并不罕見啸驯。很快就會對視圖中使用的路由管理失控。可以想象如果你在視圖中做了多少這樣的事情漩蟆。
<a href="{{ route('users.show', ['id' => $user->id]) }}">{{ $user->name }}</a>
如果想對路由名稱或者默認查詢參數(shù)值進行修改,就需要在整個應用中進行大量的字符串替換操作妓蛮,但是這會帶來重復性的工作量怠李,同時也可能會漏掉一些地方。
那我們可以做些什么來更好的處理這個問題呢蛤克?下面有兩種實現(xiàn)方式捺癞。
第一種: 修改Eloquent
// app/Models/User.php
<?php
namespace App\Models;
class User {
protected $appends = [
'url'
];
public function getUrlAttribute()
{
return route('users.show', $this);
}
}
然后在視圖中就可以這樣使用
<a href="{{ $user->url }}">{{ $user->name }}</a>
感覺寫的很干凈,是吧构挤?但對于高級開發(fā)人員髓介,你可能希望采用下一種方法。
第二種. 在Eloquent中使用URL Presenter
咋一看你可能會覺的比較眼熟筋现,是的唐础,這里我們定義一個url屬性箱歧,但與一般寫法不同的是是我們會返回一個 presenter
實例。
// 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);
}
}
然后就可以這樣使用
<a href="{{ $user->url->show }}">{{ $user->name }}</a>
如上一膨,現(xiàn)在的視圖并不關心我們?nèi)绾未_定URL呀邢,只是返回一個URL即可。 這樣做的好處在于豹绪,你修改視圖中的任何路由价淌,只需編輯兩個文件,而不是數(shù)百個瞒津。
關于更多PHP的使用输钩,請前往 PHPCasts社區(qū)