Rumah > Artikel > rangka kerja php > 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.
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.
Memandangkan kita bermula dari awal, mari buat projek Laravel baharu:
composer create-project --prefer-dist laravel/laravel repository
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
Ini akan mencipta BlogController dalam direktori app/Http/Controllers.
php artisan make:model Models/Blog -m
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('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'); } }
Petua:
Jika anda menggunakan versi lama di bawah Laravel 5.8, sila gantikan
$table->bigIncrements('id');
dengan:
$table->increments('id');
Saya akan menggunakan pangkalan data MySQL
sebagai contoh, langkah pertama ialah mencipta pangkalan data baharu.
mysql -u root -p create database laravel_repository;
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
Selepas anda mengemas kini fail .env kami perlu mengosongkan cache:
php artisan config:clear
Sekarang kita telah menyediakan pangkalan data, kita boleh mula menjalankan migrasi:
php artisan migrate
Ini akan mencipta jadual blog yang mengandungi data yang kami isytiharkan dalam penghijrahan Medan tajuk , kandungan dan user_id.
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 Kaedah
<?php namespace App\Repositories\Interfaces; use App\User; interface BlogRepositoryInterface { public function all(); public function getByUser(User $user); }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('user_id',$user->id)->get(); } }Direktori
Repositori anda sepatutnya kelihatan seperti ini:
app/└── Repositories/ ├── BlogRepository.php └── Interfaces/ └── BlogRepositoryInterface.phpAnda kini telah berjaya mencipta
repositori. Tetapi kami belum selesai, sudah tiba masanya untuk mula menggunakan repositori kami.
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('blog')->withBlogs($blogs); } public function detail($id) { $user = User::find($id); $blogs = $this->blogRepository->getByUser($user); return view('blog')->withBlogs($blogs); } }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 。
我们将注入 BlogController 中的 BlogRepository ,而不是注入 BlogController 中的 BlogRepositoryInterface ,然后让服务容器决定将使用哪个存储库。这将在 AppServiceProvider 的 boot 方法中实现,但我更喜欢为此创建一个新的 provider 来保持整洁。
php artisan make:provider RepositoryServiceProvider
我们为此创建一个新的 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 ); } }
留意用另一个 repository 替代 BlogRepository 是多么容易!
不要忘记添加 RepositoryServiceProvider 到 config/app.php 文件的 providers 列表中。完成了这些后我们需要清空缓存:
'providers' => [ \App\Providers\RepositoryServiceProvider::class ],
php artisan config:clear
现在你已经成功实现了 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!