이 기사에서는 Laravel에서 repository 디자인 패턴을 처음부터 구현하는 방법을 보여 드리겠습니다. 저는 Laravel 버전 5.8.3을 사용할 예정이지만 Laravel 버전이 가장 중요한 것은 아닙니다. 코드 작성을 시작하기 전에 repository 디자인 패턴에 대한 몇 가지 정보를 알아야 합니다.
repository 디자인 패턴을 사용하면 개체가 어떻게 지속되는지 알지 못해도 개체 작업을 할 수 있습니다. 본질적으로 이는 데이터 계층의 추상화입니다.
즉, 비즈니스 로직은 데이터를 검색하는 방법이나 데이터 소스가 무엇인지 알 필요가 없으며 비즈니스 로직은 저장소에 의존하여 올바른 데이터를 검색합니다.
이 패턴에 대해 누군가가 repository를 사용하여 데이터를 생성하거나 업데이트하는 것으로 오해하는 것을 봤습니다. 이는 repository가 수행해야 하는 작업이 아닙니다. repository는 데이터를 생성하거나 업데이트하는 것이 아니라 데이터를 검색하는 역할만 합니다.
처음부터 시작하는 것이므로 새로운 Laravel 프로젝트를 만들어 보겠습니다.
composer create-project --prefer-dist laravel/laravel repository
이 튜토리얼에서는 작은 블로그 애플리케이션을 구축하겠습니다. 이제 새로운 Laravel 프로젝트를 생성했으므로 이를 위한 컨트롤러와 모델을 생성할 차례입니다.
php artisan make:controller BlogController
이렇게 하면 app/Http/Controllers 디렉토리에 BlogController가 생성됩니다.
php artisan make:model Models/Blog -m
팁: -m
옵션은 해당 데이터베이스 마이그레이션을 생성합니다. *database/migrations-m
选项会创建一个对应的数据库迁移,你可以在 *database/migrations 目录中找到所生成的迁移。*
现在你应该能在 app/Models 目录中找到刚生成的模型 Blog 了吧。这只是一种我喜欢的存放模型的方式。
现在我们有了控制器和模型,是时候看看我们创建的迁移文件了。除了默认的 Laravel 时间戳字段外,我们的博客只需要 标题、内容 和 用户ID 字段。
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateBlogsTable extends Migration { public function up() { Schema::create('blogs', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('title'); $table->text('content'); $table->integer('user_id'); $table->timestamps(); $table->foreign('user_id') ->references('id') ->on('users'); }); } public function down() { Schema::dropIfExists('blogs'); } }
提示:
如果你使用的是 Laravel 5.8 以下的旧版本,请将
$table->bigIncrements('id');
替换为:
$table->increments('id');
我将使用 MySQL
디렉터리에서 생성된 마이그레이션을 찾을 수 있습니다. *
이제 app/Models 디렉토리에서 새로 생성된 모델 Blog을 찾을 수 있습니다. 이것은 제가 모델을 저장하는 방식입니다.
이제 컨트롤러와 모델이 있으므로 우리가 만든 마이그레이션 파일을 살펴볼 차례입니다. 기본 Laravel 타임스탬프 필드 외에도 블로그에는 Title, Content 및
UserIDmysql -u root -p create database laravel_repository;팁: 5.8 이하의 이전 버전의 Laravel을 사용하는 경우
DB_DATABASE=laravel_repositoryDB_USERNAME=rootDB_PASSWORD=secret
를 다음으로 바꾸세요.
php artisan config:clear데이터베이스 설정 저는
MySQL Database 예를 들어, 첫 번째 단계는 새 데이터베이스를 생성하는 것입니다. <h2><pre class="brush:php;toolbar:false;">php artisan migrate</pre><span class="header-link octicon octicon-link">위 명령은 </span>laravel_repository<strong>라는 새 데이터베이스를 생성합니다. 다음으로 Laravel 루트 디렉터리의 <em>.env</em> 파일에 데이터베이스 정보를 추가해야 합니다. </strong><pre class="brush:php;toolbar:false;"><?php
namespace App\Repositories\Interfaces;
use App\User;
interface BlogRepositoryInterface
{
public function all();
public function getByUser(User $user);
}</pre></h2> <p>.env<em> 파일을 업데이트한 후 캐시를 지워야 합니다. </em><pre class="brush:php;toolbar:false;"><?php
namespace App\Repositories;
use App\Models\Blog;
use App\User;
use App\Repositories\Interfaces\BlogRepositoryInterface;
class BlogRepository implements BlogRepositoryInterface
{
public function all()
{
return Blog::all();
}
public function getByUser(User $user)
{
return Blog::where(&#39;user_id&#39;,$user->id)->get();
}
}</pre><em></em><em></em>마이그레이션 실행<em></em><em>이제 데이터베이스가 설정되었으므로 마이그레이션 실행을 시작할 수 있습니다. </em><pre class="brush:php;toolbar:false;">app/└── Repositories/
├── BlogRepository.php
└── Interfaces/
└── BlogRepositoryInterface.php</pre></p> 그러면 <p>blogs<em> 테이블에는 마이그레이션에서 선언한 </em>title<em>, </em>content</p> 및 <ul style="list-style-type: disc;">user_id<li> 필드가 포함됩니다. <p><em></em></p>
</li>
<li>repository<p> 디자인 패턴 구현<em></em></p>모든 것이 준비되었으므로 이제 </li>repository</ul> 디자인 스타일 구현을 시작할 수 있습니다. <p>app<em> 디렉토리 내에 </em>Repositories<em> 디렉토리를 생성하겠습니다. 우리가 만들 두 번째 디렉터리는 </em>Repositories</p> 디렉터리 내에 있는 <p>Interfaces<em> 디렉터리입니다. </em></p>
<p>Interfaces<em> 파일에서 두 가지 메소드를 사용하여 </em>BlogRepositoryInterface<em> 인터페이스를 생성합니다. </em></p>
<h2>
<span class="header-link octicon octicon-link">모든 블로그 게시물을 반환하는 </span>all<strong> 메서드 <em></em></strong>
</h2>특정 사용자의 모든 블로그 게시물을 반환하는 <p>getByUser<em> 메서드</em><em></em><pre class="brush:php;toolbar:false;"><?php
namespace App\Http\Controllers;
use App\Repositories\Interfaces\BlogRepositoryInterface;
use App\User;
class BlogController extends Controller
{
private $blogRepository;
public function __construct(BlogRepositoryInterface $blogRepository)
{
$this->blogRepository = $blogRepository;
}
public function index()
{
$blogs = $this->blogRepository->all();
return view(&#39;blog&#39;)->withBlogs($blogs);
}
public function detail($id)
{
$user = User::find($id);
$blogs = $this->blogRepository->getByUser($user);
return view(&#39;blog&#39;)->withBlogs($blogs);
}
}</pre></p>우리가 만들어야 할 마지막 클래스는 <p>Blog입니다. <em>BlogRepositoryInterface</em> Repository<em>를 구현하면 가장 간단한 구현을 작성하겠습니다. </em><pre class="brush:php;toolbar:false;">php artisan make:provider RepositoryServiceProvider</pre></p>귀하의 🎜Repositories🎜 디렉토리는 다음과 같아야 합니다: 🎜<pre class="brush:php;toolbar:false;"><?php
namespace App\Providers;
use App\Repositories\BlogRepository;
use App\Repositories\Interfaces\BlogRepositoryInterface;
use Illuminate\Support\ServiceProvider;
class RepositoryServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(
BlogRepositoryInterface::class,
BlogRepository::class
);
}
}</pre>🎜이제 🎜repository🎜가 성공적으로 생성되었습니다. 하지만 아직 끝나지 않았습니다. 이제 🎜저장소🎜를 사용할 시간입니다. 🎜🎜🎜🎜🎜 🎜Repository🎜🎜🎜🎜를 사용하여 🎜BlogRepository🎜 사용을 시작하려면 먼저 이를 🎜BlogController🎜에 삽입해야 합니다. Laravel의 종속성 주입 덕분에 이를 다른 것으로 쉽게 교체할 수 있습니다. 컨트롤러의 모습은 다음과 같습니다. 🎜<pre class="brush:php;toolbar:false;">&#39;providers&#39; => [
\App\Providers\RepositoryServiceProvider::class
],</pre>🎜 보시다시피 컨트롤러의 코드는 매우 짧고 읽기 쉽습니다. 🎜repository🎜 덕분에 필요한 데이터를 얻기 위해 10줄의 코드가 필요하지 않습니다. 이 모든 로직을 한 줄의 코드로 수행할 수 있습니다. 🎜repository🎜의 메서드는 쉽게 재사용할 수 있으므로 단위 테스트에도 좋습니다. 🎜<p><em>repository</em> 设计模式也使更改数据源变得更加容易。在这个例子中,我们使用 <em>MySQL</em> 数据库来检索我们的博客内容。我们使用 <em>Eloquent</em> 来完成查询数据库操作。但是假设我们在某个网站上看到了一个很棒的博客 API,我们想使用这个 API 作为数据源,我们所要做的就是重写 <em>BlogRepository</em> 来调用这个 API 替换 <em>Eloquent</em> 。</p>
<h2>
<span class="header-link octicon octicon-link"></span><strong>RepositoryServiceProvider</strong>
</h2>
<p>我们将注入 <em>BlogController</em> 中的 <em>BlogRepository</em> ,而不是注入 <em>BlogController</em> 中的 <em>BlogRepositoryInterface</em> ,然后让服务容器决定将使用哪个存储库。这将在 <em>AppServiceProvider</em> 的 <em>boot</em> 方法中实现,但我更喜欢为此创建一个新的 <em>provider</em> 来保持整洁。</p><pre class="brush:php;toolbar:false;">php artisan make:provider RepositoryServiceProvider</pre><p>我们为此创建一个新的 <em>provider</em> 的原因是,当您的项目开始发展为大型项目时,结构会变得非常凌乱。设想一下,一个拥有 10 个以上模型的项目,每个模型都有自己的 <em>repository</em> ,你的 <em>AppServiceProvider</em> 可读性将会大大降低。</p>
<p>我们的 <em>RepositoryServiceProvider</em> 会像下面这样:</p><pre class="brush:php;toolbar:false;"><?php
namespace App\Providers;
use App\Repositories\BlogRepository;
use App\Repositories\Interfaces\BlogRepositoryInterface;
use Illuminate\Support\ServiceProvider;
class RepositoryServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(
BlogRepositoryInterface::class,
BlogRepository::class
);
}
}</pre><p>留意用另一个 <em>repository</em> 替代 <em>BlogRepository</em> 是多么容易!</p>
<p>不要忘记添加 <em>RepositoryServiceProvider</em> 到 <em>config/app.php</em> 文件的 <em>providers</em> 列表中。完成了这些后我们需要清空缓存:</p><pre class="brush:php;toolbar:false;">&#39;providers&#39; => [
\App\Providers\RepositoryServiceProvider::class
],</pre><pre class="brush:php;toolbar:false;">php artisan config:clear</pre><h2>
<span class="header-link octicon octicon-link"></span><strong>就是这样</strong>
</h2>
<p>现在你已经成功实现了 <em>repository</em> 设计模式,不是很难吧?</p>
<p>你可以选择增加一些路由和视图来拓展代码,但本文将在这里结束,因为本文主要是介绍 <em>repository</em> 设计模式的。</p>
<p>如果你喜欢这篇文章,或者它帮助你实现了 <em>repository</em> 设计模式,请确保你也查看了我的其他文章。如果你有任何反馈、疑问,或希望我撰写另一个有关 Laravel 的主题,请随时发表评论。</p>
<blockquote>
<p>原文地址:https://itnext.io/repository-design-pattern-done-right-in-laravel-d177b5fa75d4</p>
<p>译文地址:https://learnku.com/laravel/t/31798</p>
</blockquote>
<p>【相关推荐:<a href="https://www.php.cn/course/list/23.html" target="_blank">laravel视频教程</a>】</p>
위 내용은 Laravel에서 저장소 디자인 패턴을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!