Laravel에서 PHP의 데코레이터 패턴을 어떻게 사용하나요? 다음 글에서는 Laravel에서 PHP 데코레이터 모드를 사용하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.
디자인 패턴은 모든 개발자에게 중요합니다. 이는 빌드하는 모든 프로젝트에서 매우 일반적인 문제를 해결합니다.
동일한 클래스의 다른 개체에 영향을 주지 않고 개체에 추가 동작을 추가하는 데 도움이 됩니다.
데코레이터 패턴은 동일한 클래스에 있는 다른 개체의 동작에 영향을 주지 않고 동작을 단일 개체에 동적으로 추가할 수 있도록 하는 디자인 패턴입니다.
Post 모델이 있다고 가정해 봅시다
class Post extends Model { public function scopePublished($query) { return $query->where('published_at', '<=', 'NOW()'); } }
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); } }
现在再次检查文件,您会发现它非常易于阅读和维护。同样,它也是可测试的,如果您决定在某个时候删除缓存层。您只需在AppServiceProvider
rrreee
PostsRepository
app/Providers/AppServiceProvider.php
에 바인딩 방법을 추가하세요. PostsRepositoryInterface
를 주입할 때마다 Laravel은 PostsRepository
인스턴스를 생성하고 반환합니다. 그것. 데코레이터를 통한 캐싱
여기서 캐싱은 동작이고 개체/클래스는우리는 처음에 데코레이터 패턴을 사용하면 동일한 클래스의 다른 객체에 영향을 주지 않고 단일 객체에 동작을 추가할 수 있다고 말했습니다.
PostsRepository
입니다. 다음 콘텐츠로 app/Repositories/Posts/PostsCacheRepository.php
에 PostsCacheRepository
를 생성해 보겠습니다. rrreee
AppServiceProvider
에서 바인딩을 변경하기만 하면 됩니다. 추가 변경은 필요하지 않습니다. 🎜🎜🎜🎜🎜 결론 🎜🎜🎜🎜 데코레이터 패턴을 사용하여 모델을 캐시하는 방법을 배웠습니다. 🎜🎜 저장소 패턴이 데코레이터 패턴에 연결되는 방법을 보여주었습니다. 🎜🎜 종속성 주입과 Laravel IOC가 우리의 삶을 쉽게 만드는 방법 🎜🎜 Laravel 구성 요소는 강력합니다 🎜🎜 🎜 이 글을 재미있게 읽으셨기를 바랍니다. 강력한 디자인 패턴과 프로젝트를 쉽게 유지하고 관리하는 방법을 보여줍니다. 🎜🎜🎜원본 주소: https://dev.to/ahmedash95/design-patterns-in-php- decorator-with-laravel-5hk6🎜🎜 🎜[관련 추천: 🎜laravel 비디오 튜토리얼🎜]🎜위 내용은 Laravel에서 PHP의 데코레이터 패턴을 사용하는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!