Rumah > rangka kerja php > Laravel > Bagaimana untuk melaksanakan corak reka bentuk Repositori dalam Laravel

Bagaimana untuk melaksanakan corak reka bentuk Repositori dalam Laravel

青灯夜游
Lepaskan: 2022-11-08 20:39:44
ke hadapan
1658 orang telah melayarinya

Bagaimana untuk melaksanakan corak reka bentuk Repositori dalam Laravel

Dalam artikel ini, saya akan menunjukkan kepada anda cara melaksanakan repositori corak reka bentuk dari awal dalam Laravel. Saya akan menggunakan Laravel versi 5.8.3, tetapi versi Laravel bukanlah yang paling penting. Sebelum anda mula menulis kod, anda perlu mengetahui beberapa maklumat tentang corak reka bentuk repositori.

Bagaimana untuk melaksanakan corak reka bentuk Repositori dalam Laravel

repositori Corak reka bentuk membolehkan anda bekerja dengan objek tanpa mengetahui cara objek tersebut diteruskan. Pada asasnya, ia adalah abstraksi lapisan data.

Ini bermakna logik perniagaan anda tidak perlu tahu cara mendapatkan semula data atau sumber data, logik perniagaan bergantung pada repositori untuk mendapatkan semula data yang betul.

Mengenai corak ini, saya melihat sesetengah orang salah faham sebagai repositori digunakan untuk mencipta atau mengemas kini data. Ini bukan perkara yang sepatutnya dilakukan oleh repositori, repositori tidak sepatutnya mencipta atau mengemas kini data, hanya untuk mendapatkannya semula.

Adakah anda faham? Mari kita tulis kod bersama-sama

Memandangkan kita bermula dari awal, mari buat projek Laravel baharu:

composer create-project --prefer-dist laravel/laravel repository
Salin selepas log masuk

Untuk tutorial ini, kami akan membina aplikasi blog kecil. Memandangkan kami telah mencipta projek Laravel baharu, kami harus mencipta pengawal dan model untuknya.

php artisan make:controller BlogController
Salin selepas log masuk

Ini akan mencipta BlogController dalam direktori app/Http/Controllers.

php artisan make:model Models/Blog -m
Salin selepas log masuk

Petua: Pilihan
-m akan mencipta migrasi pangkalan data yang sepadan Anda boleh mencari migrasi yang dijana dalam direktori *pangkalan data/penghijrahan
. *

Kini anda sepatutnya dapat mencari model Blog yang baru dijana dalam direktori apl/Model. Ini hanyalah cara saya suka menyimpan model saya.

Sekarang kami mempunyai pengawal dan model kami, tiba masanya untuk melihat fail migrasi yang kami buat. Selain medan cap waktu Laravel lalai, blog kami hanya memerlukan medan Tajuk, Kandungan dan ID Pengguna.

<?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(&#39;blogs&#39;, function (Blueprint $table) {
            $table->bigIncrements(&#39;id&#39;);
            $table->string(&#39;title&#39;);
            $table->text(&#39;content&#39;);
            $table->integer(&#39;user_id&#39;);
            $table->timestamps();

            $table->foreign(&#39;user_id&#39;)
                  ->references(&#39;id&#39;)
                  ->on(&#39;users&#39;);
        });
    }

    public function down()
    {
        Schema::dropIfExists(&#39;blogs&#39;);
    }
}
Salin selepas log masuk

Petua:
Jika anda menggunakan versi lama di bawah Laravel 5.8, sila gantikan

$table->bigIncrements(&#39;id&#39;);
Salin selepas log masuk

dengan:

$table->increments(&#39;id&#39;);
Salin selepas log masuk

Sediakan pangkalan data

Saya akan menggunakan pangkalan data MySQL sebagai contoh, langkah pertama ialah mencipta pangkalan data baharu.

mysql -u root -p 
create database laravel_repository;
Salin selepas log masuk

Arahan di atas akan mencipta pangkalan data baharu yang dipanggil laravel_repository. Seterusnya kita perlu menambah maklumat pangkalan data pada fail .env dalam direktori akar Laravel.

DB_DATABASE=laravel_repositoryDB_USERNAME=rootDB_PASSWORD=secret
Salin selepas log masuk

Selepas anda mengemas kini fail .env kami perlu mengosongkan cache:

php artisan config:clear
Salin selepas log masuk
Salin selepas log masuk

Jalankan migrasi

Sekarang kita telah menyediakan pangkalan data, kita boleh mula menjalankan migrasi:

php artisan migrate
Salin selepas log masuk

Ini akan mencipta jadual blog yang mengandungi data yang kami isytiharkan dalam penghijrahan Medan tajuk , kandungan dan user_id.

Melaksanakan repositori corak reka bentuk

Semuanya sudah sedia, kini kita boleh mula melaksanakan repositori gaya reka bentuk. Kami akan mencipta direktori Repositori di dalam direktori app. Direktori kedua yang akan kami buat ialah direktori Antaramuka, yang terletak di dalam direktori Repositori.

Dalam fail Antaramuka kami akan mencipta antara muka BlogRepositoryInterface dengan dua kaedah.

  • Mengembalikan kaedah semua semua catatan blog

  • Mengembalikan getByUser<🎜 semua catatan blog pengguna tertentu > Kaedah

<?php

namespace App\Repositories\Interfaces;

use App\User;

interface BlogRepositoryInterface
{
    public function all();

    public function getByUser(User $user);
}
Salin selepas log masuk
Kelas terakhir yang perlu kami buat ialah

BlogRepository yang akan melaksanakan BlogRepositoryInterface Kami akan menulis kaedah Pelaksanaan yang paling mudah.

<?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();
    }
}
Salin selepas log masuk
Direktori

Repositori anda sepatutnya kelihatan seperti ini:

app/└── Repositories/
    ├── BlogRepository.php
    └── Interfaces/
        └── BlogRepositoryInterface.php
Salin selepas log masuk
Anda kini telah berjaya mencipta

repositori. Tetapi kami belum selesai, sudah tiba masanya untuk mula menggunakan repositori kami.

Menggunakan Repositori

Dalam Pengawal Untuk mula menggunakan

BlogRepository kita perlu Suntikan ke dalam BlogController. Terima kasih kepada suntikan pergantungan Laravel, kami boleh menggantikannya dengan mudah dengan yang lain. Beginilah rupa pengawal kami:

<?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);
    }
}
Salin selepas log masuk
Seperti yang anda lihat, kod dalam pengawal adalah sangat pendek dan sangat mudah dibaca. Anda tidak memerlukan sepuluh baris kod untuk mendapatkan data yang anda perlukan, terima kasih kepada

repositori , semua logik ini boleh dilakukan dalam satu baris kod. Ini juga bagus untuk ujian unit kerana kaedah repositori mudah digunakan semula.

repository 设计模式也使更改数据源变得更加容易。在这个例子中,我们使用 MySQL 数据库来检索我们的博客内容。我们使用 Eloquent 来完成查询数据库操作。但是假设我们在某个网站上看到了一个很棒的博客 API,我们想使用这个 API 作为数据源,我们所要做的就是重写 BlogRepository 来调用这个 API 替换 Eloquent

RepositoryServiceProvider

我们将注入 BlogController 中的 BlogRepository ,而不是注入 BlogController 中的 BlogRepositoryInterface ,然后让服务容器决定将使用哪个存储库。这将在 AppServiceProviderboot 方法中实现,但我更喜欢为此创建一个新的 provider 来保持整洁。

php artisan make:provider RepositoryServiceProvider
Salin selepas log masuk

我们为此创建一个新的 provider 的原因是,当您的项目开始发展为大型项目时,结构会变得非常凌乱。设想一下,一个拥有 10 个以上模型的项目,每个模型都有自己的 repository ,你的 AppServiceProvider 可读性将会大大降低。

我们的 RepositoryServiceProvider 会像下面这样:

<?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
        );
    }
}
Salin selepas log masuk

留意用另一个 repository 替代 BlogRepository 是多么容易!

不要忘记添加 RepositoryServiceProviderconfig/app.php 文件的 providers 列表中。完成了这些后我们需要清空缓存:

&#39;providers&#39; => [
  \App\Providers\RepositoryServiceProvider::class
],
Salin selepas log masuk
php artisan config:clear
Salin selepas log masuk
Salin selepas log masuk

就是这样

现在你已经成功实现了 repository 设计模式,不是很难吧?

你可以选择增加一些路由和视图来拓展代码,但本文将在这里结束,因为本文主要是介绍 repository 设计模式的。

如果你喜欢这篇文章,或者它帮助你实现了 repository 设计模式,请确保你也查看了我的其他文章。如果你有任何反馈、疑问,或希望我撰写另一个有关 Laravel 的主题,请随时发表评论。

原文地址:https://itnext.io/repository-design-pattern-done-right-in-laravel-d177b5fa75d4

译文地址:https://learnku.com/laravel/t/31798

【相关推荐:laravel视频教程

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan corak reka bentuk Repositori dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan