在Eloquent中封裝URL屬性來統(tǒng)一管理視圖中的路由

user-model.png

在 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ū)

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仲智,隨后出現(xiàn)的幾起案子买乃,更是在濱河造成了極大的恐慌,老刑警劉巖钓辆,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剪验,死亡現(xiàn)場離奇詭異,居然都是意外死亡前联,警方通過查閱死者的電腦和手機功戚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來似嗤,“玉大人啸臀,你說我怎么就攤上這事∷嘎洌” “怎么了乘粒?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伤塌。 經(jīng)常有香客問我灯萍,道長,這世上最難降的妖魔是什么每聪? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任旦棉,我火速辦了婚禮,結(jié)果婚禮上药薯,老公的妹妹穿的比我還像新娘绑洛。我一直安慰自己,他們只是感情好童本,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布真屯。 她就那樣靜靜地躺著,像睡著了一般巾陕。 火紅的嫁衣襯著肌膚如雪讨跟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天鄙煤,我揣著相機與錄音晾匠,去河邊找鬼。 笑死梯刚,一個胖子當著我的面吹牛凉馆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亡资,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼澜共,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锥腻?” 一聲冷哼從身側(cè)響起嗦董,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘦黑,沒想到半個月后京革,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡幸斥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年匹摇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甲葬。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡廊勃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出经窖,到底是詐尸還是另有隱情坡垫,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布画侣,位于F島的核電站葛虐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棉钧。R本人自食惡果不足惜屿脐,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宪卿。 院中可真熱鬧的诵,春花似錦、人聲如沸佑钾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽休溶。三九已至代赁,卻和暖如春扰她,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芭碍。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工徒役, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窖壕。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓忧勿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞻讽。 傳聞我的和親對象是個殘疾皇子鸳吸,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容