91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel中如何使用PHP的裝飾器模式

發布時間:2022-09-20 11:33:19 來源:億速云 閱讀:112 作者:iii 欄目:編程語言

本文小編為大家詳細介紹“Laravel中如何使用PHP的裝飾器模式”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Laravel中如何使用PHP的裝飾器模式”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

裝飾器模式定義:

它可以幫助您在一個對象上添加額外的行為,而又不影響同一類中的其他對象。

維基百科:

裝飾器模式是一種設計模式,它允許動態地將行為添加到單個對象,而不會影響同一類中其他對象的行為

問題

假設我們有一個Post模型

class Post extends Model
{
    public function scopePublished($query) {
        return $query->where('published_at', '<=', 'NOW()');
    }
}

在我們的PostsController中,我們有如下的index方法

class PostsController extends Controller
{
    public function index() {
        $posts = Post::published()->get();
        return $posts;
    }
}

為了緩存帖子并避免每次我們需要列出帖子時都查詢數據庫,我們可以執行以下操作

class PostsController extends Controller
{
    public function index() {
        $minutes = 1440; # 1 day
        $posts = Cache::remember('posts', $minutes, function () {
            return Post::published()->get();
        });
        return $posts;
    }
}

現在,我們將帖子緩存1天。但看看代碼,控制器了解了太多。它知道我們緩存了多少天,它自己緩存了對象。

同樣,假設您正在為HomePageController的Tag,Category,Archives實現相同的功能。閱讀和維護的代碼太多了。

倉庫模式

在大多數情況下,倉庫模式是連接到裝飾器模式。

首先,讓我們使用倉庫模式分離獲取帖子的方式,創建具有以下內容的app/Repositories/Posts/PostsRepositoryInterface.php

namespace App\Repositories\Posts;

interface PostsRepositoryInterface 
{

    public function get();

    public function find(int $id);

}

在同個目錄下創建具有下面內容的 PostsRepository

namespace App\Repositories\Posts;

use App\Post;

class PostsRepository implements PostsRepositoryInterface
{
    protected $model;

    public function __construct(Post $model) {
        $this->model = $model;
    }

    public function get() {
        return $this->model->published()->get();
    }

    public function find(int $id) {
        return $this->model->published()->find($id);
    }

}

回到PostsController并將更改應用為

namespace App\Http\Controllers;

use App\Repositories\Posts\PostsRepositoryInterface;
use Illuminate\Http\Request;

class PostsController extends Controller
{
    public function index(PostsRepositoryInterface $postsRepo) {
        return $postsRepo->get();
    }
}

控制器變得健康,知道足夠的細節來完成工作。

在這里,我們依靠 Laravel 的 IOC 注入 Posts 接口的具體對象來獲取我們的帖子

我們需要做的就是告訴Laravel的IOC使用接口時要創建哪個類。

在你的 app/Providers/AppServiceProvider.php 添加綁定方法

namespace App\Providers;

use App\Repositories\Posts\PostsRepositoryInterface;
use App\Repositories\Posts\PostsRepository;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(PostsRepositoryInterface::class,PostsRepository::class);
    }
}

現在無論何時我們注入PostsRepositoryInterface Laravel 都會創建 PostsRepository 的實例并將其返回。

通過裝飾器實現緩存

我們在一開始就說過,裝飾器模式允許將行為添加到單個對象,而不會影響同一類中的其他對象。

在這里緩存是行為,對象/類是 PostsRepository

讓我們在 app/Repositories/Posts/PostsCacheRepository.php 中創建具有以下內容的PostsCacheRepository

namespace App\Repositories\Posts;

use App\Post;
use Illuminate\Cache\CacheManager;

class PostsCacheRepository implements PostsRepositoryInterface
{
    protected $repo;

    protected $cache;

    const TTL = 1440; # 1 day

    public function __construct(CacheManager $cache, PostsRepository $repo) {
        $this->repo = $repo;
        $this->cache = $cache;
    }

    public function get() {
        return $this->cache->remember('posts', self::TTL, function () {
            return $this->repo->get();
        });
    }

    public function find(int $id) {
        return $this->cache->remember('posts.'.$id, self::TTL, function () {
            return $this->repo->find($id);
        });
    }
}

在這個類中,我們接受 Caching 對象和 PostsRepository 對象,然后使用類(裝飾器)將緩存行為添加到 PostsReposiory 實例。

我們可以使用相同的示例將HTTP請求發送到某些服務,然后在失敗的情況下返回模型。我相信您會從該模式以及它是如何輕松添加行為中受益。

最后一件事是修改 AppServiceProvider 接口綁定以創建 PostsCacheRepository 實例而不是PostsRepository

namespace App\Providers;

use App\Repositories\Posts\PostsRepositoryInterface;
use App\Repositories\Posts\PostsCacheRepository;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(PostsRepositoryInterface::class,PostsCacheRepository::class);
    }
}

現在再次檢查文件,您會發現它非常易于閱讀和維護。同樣,它也是可測試的,如果您決定在某個時候刪除緩存層。您只需在AppServiceProvider中更改綁定即可。無需額外更改。

讀到這里,這篇“Laravel中如何使用PHP的裝飾器模式”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赤壁市| 皮山县| 清远市| 隆昌县| 沁阳市| 丰台区| 防城港市| 东乌珠穆沁旗| 宜川县| 广水市| 长顺县| 金寨县| 宣汉县| 玉屏| 宁化县| 堆龙德庆县| 石台县| 无锡市| 平原县| 铜鼓县| 扶沟县| 寻乌县| 明水县| 乌鲁木齐县| 长治市| 八宿县| 泉州市| 新营市| 基隆市| 镇平县| 宝坻区| 蓝山县| 沙田区| 绥中县| 武穴市| 吉林市| 冷水江市| 镇原县| 海原县| 新昌县| 即墨市|