Bagaimana untuk menggunakan corak penghias PHP dalam Laravel? Artikel berikut akan memperkenalkan kepada anda cara menggunakan mod penghias PHP dalam Laravel saya harap ia akan membantu anda!
Corak reka bentuk adalah penting untuk setiap pembangun. Ia menyelesaikan masalah yang sangat biasa dalam setiap projek yang anda bina.
Ia membantu anda menambah gelagat tambahan pada objek tanpa menjejaskan objek lain dalam kelas yang sama objek lain.
Corak penghias ialah corak reka bentuk yang membolehkan menambah gelagat secara dinamik pada objek tunggal, Tanpa menjejaskan tingkah laku objek lain dalam kelas yang sama
Katakan kita mempunyai model Post
class Post extends Model { public function scopePublished($query) { return $query->where('published_at', '<=', 'NOW()'); } }
Dalam PostsController kami, kami mempunyai kaedah indeks seperti berikut
class PostsController extends Controller { public function index() { $posts = Post::published()->get(); return $posts; } }
Untuk cache catatan dan mengelakkan pertanyaan pangkalan data setiap kali kami perlu menyenaraikan siaran, kami boleh melakukan perkara berikut
class PostsController extends Controller { public function index() { $minutes = 1440; # 1 day $posts = Cache::remember('posts', $minutes, function () { return Post::published()->get(); }); return $posts; } }
Kami kini menyimpan siaran selama 1 hari. Tetapi melihat kod, pengawal tahu terlalu banyak. Ia tahu berapa hari kita telah menyimpannya, ia menyimpan objek itu sendiri.
Begitu juga, katakan anda melaksanakan fungsi yang sama untuk Teg, Kategori, Arkib HomePageController. Itu terlalu banyak kod untuk dibaca dan diselenggara.
Dalam kebanyakan kes, corak repositori disambungkan kepada corak penghias.
Pertama, mari kita gunakan mod gudang untuk memisahkan cara mendapatkan siaran dan buat app/Repositories/Posts/PostsRepositoryInterface.php
namespace App\Repositories\Posts; interface PostsRepositoryInterface { public function get(); public function find(int $id); }
dengan kandungan berikut dalam direktori yang sama . Kandungan 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); } }
Kembali ke PostsController dan gunakan perubahan pada
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(); } }
Pengawal menjadi sihat dan mengetahui butiran yang mencukupi untuk menyelesaikan tugas.
Di sini, kami bergantung pada IOC Laravel untuk menyuntik objek khusus antara muka Posts untuk mendapatkan siaran kami
Apa yang perlu kami lakukan ialah memberitahu IOC Laravel kelas mana yang perlu dibuat apabila menggunakan antara muka.
Dalam app/Providers/AppServiceProvider.php
anda tambah kaedah pengikatan
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); } }
Sekarang apabila kita menyuntik PostsRepositoryInterface
Laravel akan mencipta contoh PostsRepository
dan mengembalikannya.
Kami berkata pada mulanya bahawa corak penghias membenarkan menambah tingkah laku pada objek tunggal tanpa Akan menjejaskan objek lain dalam kelas yang sama.
Di sini caching ialah tingkah laku dan objek/kelas ialah PostsRepository
.
Mari kita cipta 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); }); } }
Dalam kelas ini kita menerima objek Caching dan objek PostsRepository dan kemudian menggunakan kelas (penghias) Tambah tingkah laku caching ke Contoh PostsRepository.
Kita boleh menggunakan contoh yang sama untuk menghantar permintaan HTTP kepada sesetengah perkhidmatan dan kemudian mengembalikan model sekiranya berlaku kegagalan. Saya percaya anda akan mendapat manfaat daripada corak ini dan betapa mudahnya untuk menambah tingkah laku.
Perkara terakhir ialah mengubah suai antara muka AppServiceProvider yang mengikat untuk mencipta contoh PostsCacheRepository dan bukannya 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); } }
Sekarang semak fail sekali lagi dan anda akan melihat bahawa ia sangat mudah dibaca dan mengekalkan. Begitu juga, ia boleh diuji jika anda memutuskan untuk mengalih keluar lapisan cache pada satu ketika. Anda hanya perlu menukar pengikatan dalam AppServiceProvider
. Tiada perubahan tambahan diperlukan.
Semoga anda seronok membaca artikel ini. Ia menunjukkan kepada anda corak reka bentuk yang berkuasa dan cara menjadikan projek anda mudah diselenggara dan diurus
Alamat asal: https://dev.to/ahmedash95/design-patterns-in-php- decorator-with -laravel-5hk6
[Cadangan berkaitan: tutorial video laravel]
Atas ialah kandungan terperinci Mari kita bincangkan tentang cara menggunakan corak penghias PHP dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!