Laravel에서 PHP의 데코레이터 패턴을 사용하는 방법에 대해 이야기해 보겠습니다.

青灯夜游
풀어 주다: 2022-09-20 20:26:36
앞으로
2357명이 탐색했습니다.

Laravel에서 PHP의 데코레이터 패턴을 어떻게 사용하나요? 다음 글에서는 Laravel에서 PHP 데코레이터 모드를 사용하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.

Laravel에서 PHP의 데코레이터 패턴을 사용하는 방법에 대해 이야기해 보겠습니다.

디자인 패턴은 모든 개발자에게 중요합니다. 이는 빌드하는 모든 프로젝트에서 매우 일반적인 문제를 해결합니다.

데코레이터 패턴 정의:

동일한 클래스의 다른 개체에 영향을 주지 않고 개체에 추가 동작을 추가하는 데 도움이 됩니다.

Wikipedia:

데코레이터 패턴은 동일한 클래스에 있는 다른 개체의 동작에 영향을 주지 않고 동작을 단일 개체에 동적으로 추가할 수 있도록 하는 디자인 패턴입니다.

질문

Post 모델이 있다고 가정해 봅시다

class Post extends Model
{
    public function scopePublished($query) {
        return $query->where('published_at', '<=&#39;, &#39;NOW()&#39;);
    }
}
로그인 후 복사

PostsController에는 다음과 같은 인덱스 메소드가 있습니다

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의 태그, 카테고리, 아카이브에 대해 동일한 기능을 구현한다고 가정해 보겠습니다. 읽고 유지 관리하기에는 코드가 너무 많습니다.

리포지토리 패턴

대부분의 경우 리포지토리 패턴은 데코레이터 패턴에 연결됩니다.

먼저 warehouse모드 분리를 사용하여 게시물을 가져오고, 다음 콘텐츠로 app/Repositories/Posts/PostsRepositoryInterface.php를 생성합니다.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);
    }
}
로그인 후 복사

现在再次检查文件,您会发现它非常易于阅读和维护。同样,它也是可测试的,如果您决定在某个时候删除缓存层。您只需在AppServiceProviderrrreee

같은 디렉토리에 다음 콘텐츠로 생성합니다. PostsRepository

rrreee는 PostsController로 돌아가서 rrreee 컨트롤러가 정상이 되고 작업을 완료하기에 충분한 세부 정보를 알게 되면 변경 사항을 적용합니다.

여기서 우리는 게시물을 얻기 위해 Posts 인터페이스의 특정 개체를 삽입하기 위해 Laravel의 IOC에 의존합니다.
  • 우리가 해야 할 일은 인터페이스를 사용할 때 어떤 클래스를 생성할지 Laravel의 IOC에 알려주는 것뿐입니다.
  • app/Providers/AppServiceProvider.php에 바인딩 방법을 추가하세요.
  • rrreee
  • 이제 PostsRepositoryInterface를 주입할 때마다 Laravel은 PostsRepository 인스턴스를 생성하고 반환합니다. 그것.

데코레이터를 통한 캐싱

우리는 처음에 데코레이터 패턴을 사용하면 동일한 클래스의 다른 객체에 영향을 주지 않고 단일 객체에 동작을 추가할 수 있다고 말했습니다.

여기서 캐싱은 동작이고 개체/클래스는 PostsRepository입니다.

다음 콘텐츠로 app/Repositories/Posts/PostsCacheRepository.phpPostsCacheRepository를 생성해 보겠습니다. rrreee

이 클래스에서는 Caching 객체와 PostsRepository 객체를 허용합니다. 클래스(데코레이터)를 사용하여 PostsRepository 인스턴스에 캐싱 동작을 추가합니다. 🎜🎜동일한 예를 사용하여 일부 서비스에 HTTP 요청을 보낸 다음 실패할 경우 모델을 반환할 수 있습니다. 나는 당신이 이 패턴과 동작을 추가하는 것이 얼마나 쉬운지로부터 이익을 얻을 것이라고 믿습니다. 🎜🎜마지막으로 AppServiceProvider 인터페이스 바인딩을 수정하여 PostsRepository 대신 PostsCacheRepository 인스턴스를 생성하는 것입니다. 🎜rrreee🎜 이제 파일을 다시 확인하면 읽고 유지하기가 매우 쉽다는 것을 알 수 있습니다. 마찬가지로, 어느 시점에서 캐시 레이어를 제거하기로 결정한 경우에도 테스트 가능합니다. AppServiceProvider에서 바인딩을 변경하기만 하면 됩니다. 추가 변경은 필요하지 않습니다. 🎜🎜🎜🎜🎜 결론 🎜🎜🎜🎜 데코레이터 패턴을 사용하여 모델을 캐시하는 방법을 배웠습니다. 🎜🎜 저장소 패턴이 데코레이터 패턴에 연결되는 방법을 보여주었습니다. 🎜🎜 종속성 주입과 Laravel IOC가 우리의 삶을 쉽게 만드는 방법 🎜🎜 Laravel 구성 요소는 강력합니다 🎜🎜 🎜 이 글을 재미있게 읽으셨기를 바랍니다. 강력한 디자인 패턴과 프로젝트를 쉽게 유지하고 관리하는 방법을 보여줍니다. 🎜🎜🎜원본 주소: https://dev.to/ahmedash95/design-patterns-in-php- decorator-with-laravel-5hk6🎜🎜 🎜[관련 추천: 🎜laravel 비디오 튜토리얼🎜]🎜

위 내용은 Laravel에서 PHP의 데코레이터 패턴을 사용하는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿