在Eloquent中封裝URL屬性來統一管理視圖中的路由

在 Laravel 應用程序中擁有數十個甚至數百個視圖並不罕見。很快就會對視圖中使用的路由管理失控。能夠想象若是你在視圖中作了多少這樣的事情。php

<a href="{{ route('users.show', ['id' => $user->id]) }}">{{ $user->name }}</a>

若是想對路由名稱或者默認查詢參數值進行修改,就須要在整個應用中進行大量的字符串替換操做,可是這會帶來重複性的工做量,同時也可能會漏掉一些地方。html

那咱們能夠作些什麼來更好的處理這個問題呢?下面有兩種實現方式。app

第一種: 修改Eloquent

// 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

第二種. 在Eloquent中使用URL Presenter

咋一看你可能會覺的比較眼熟,是的,這裏咱們定義一個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

相關文章
相關標籤/搜索