O le vaiaso talu ai na ou tusia ai
<?php
interface PostRepository
{
public function getById($id): Post;
public function save(Post $post);
public function delete($id);
}
Ae ui i lea, i galuega moni, pe afai na filifili e faʻaaoga fale teu oloa, o metotia mo le toe maua mai o faʻamaumauga e masani ona faʻaopoopoina ia i latou:
<?php
interface PostRepository
{
public function getById($id): Post;
public function save(Post $post);
public function delete($id);
public function getLastPosts();
public function getTopPosts();
public function getUserPosts($userId);
}
O nei metotia e mafai ona faʻatinoina e ala i le Eloquent scopes, ae o le faʻateleina o vasega faʻalapotopotoga ma le tiute o le aumaia o latou lava e le o se manatu sili lea, ma o le faʻanofoina o lenei tiute i vasega teu oloa e foliga mai e talafeagai. E fa'apea? Na ou vaʻaia faʻapitoa lenei faʻaoga i ni vaega se lua. O le vaega muamua o metotia o le a faʻaaogaina i galuega tusitusi.
O le galuega tusitusi masani o le:
- fausiaina o se mea fou ma luitau PostRepository::save
- PostRepository::getById, fa'aogaina ma le vala'au PostRepository::save
- se luitau PostRepository:: tape
O galuega tusitusi e le fa'aogaina auala e aumai ai. I fa'agaioiga faitau, na'o le get* metotia e fa'aaogaina. Afai e te faitau e uiga i Fa'avae Fa'avae Va'aiga (tusi I в SOLID), ona manino ai lea o la tatou atinaʻe e telē tele ma faʻatino a itiiti ifo ma le lua ni tiute eseese. Ua oo i le taimi e vaevae ai i le lua. Metotia getById e manaʻomia i mea uma e lua, ae a oʻo ina sili atu le lavelave o le talosaga, o le a eseese ona faʻatinoga. O le a tatou vaʻai i lenei mea i se taimi mulimuli ane. Na ou tusia e uiga i le le aoga o le vaega tusitusi i se tusiga talu ai, o lea i lenei mea o le a na ona galo ia te au.
O le vaega Faitau e foliga mai ia te aʻu e le aoga tele, talu ai e oʻo lava mo Eloquent atonu e tele faʻatinoga iinei. O le a le igoa e faaigoa ai le vasega? E mafai ReadPostRepository, ae i le mamanu Faletupe ua itiiti sona taua. E mafai lava PostQueries:
<?php
interface PostQueries
{
public function getById($id): Post;
public function getLastPosts();
public function getTopPosts();
public function getUserPosts($userId);
}
O le faʻatinoina ma le Eloquent e faigofie lava:
<?php
final class EloquentPostQueries implements PostQueries
{
public function getById($id): Post
{
return Post::findOrFail($id);
}
/**
* @return Post[] | Collection
*/
public function getLastPosts()
{
return Post::orderBy('created_at', 'desc')
->limit(/*some limit*/)
->get();
}
/**
* @return Post[] | Collection
*/
public function getTopPosts()
{
return Post::orderBy('rating', 'desc')
->limit(/*some limit*/)
->get();
}
/**
* @param int $userId
* @return Post[] | Collection
*/
public function getUserPosts($userId)
{
return Post::whereUserId($userId)
->orderBy('created_at', 'desc')
->get();
}
}
E tatau ona fesoʻotaʻi le atinaʻe ma le faʻatinoga, mo se faʻataʻitaʻiga i AppServiceProvider:
<?php
final class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(PostQueries::class,
EloquentPostQueries::class);
}
}
O lenei vasega ua uma ona aoga. Na te iloa lona tiute e ala i le faʻamatuʻuina atu o le pule poʻo le vasega faʻalapotopotoga. I totonu o se pule e mafai ona faʻaaogaina e pei o lenei:
<?php
final class PostsController extends Controller
{
public function lastPosts(PostQueries $postQueries)
{
return view('posts.last', [
'posts' => $postQueries->getLastPosts(),
]);
}
}
Metotia PostsController::LastPosts na o le talosaga atu mo se faatinoga PostsQueries ma galulue faatasi ai. I le kamupani na matou faʻafesoʻotaʻi PostQueries ma le vasega EloquentPostQueries ma o lenei vasega o le a suia i le pule.
Sei o tatou mafaufau ua matua lauiloa a tatou talosaga. E afe ma afe tagata fa'aoga i minute ta'itasi e tatala le itulau ma lomiga fou. O lomiga sili ona lauiloa e faitau soo foi. O faʻamaumauga e le lelei tele le taulimaina o ia avega, o lea latou te faʻaogaina ai se fofo masani - o se cache. I le faʻaopoopoga i le database, o loʻo teuina se faʻamatalaga faʻamatalaga i totonu o le teuina e sili ona lelei mo nisi gaioiga - memcached poʻo toe fai.
E masani lava e le faigata tele le faʻaogaina o manatu, ae o le faʻatinoina i le EloquentPostQueries e le saʻo (pe a naʻo Nofofua Tiute Mataupu Faavae). E sili atu le masani le faʻaaogaina o se mamanu Tagata teuteu ma fa'atino le caching e fai ma teuteuga mo le gaioiga autu:
<?php
use IlluminateContractsCacheRepository;
final class CachedPostQueries implements PostQueries
{
const LASTS_DURATION = 10;
/** @var PostQueries */
private $base;
/** @var Repository */
private $cache;
public function __construct(
PostQueries $base, Repository $cache)
{
$this->base = $base;
$this->cache = $cache;
}
/**
* @return Post[] | Collection
*/
public function getLastPosts()
{
return $this->cache->remember('last_posts',
self::LASTS_DURATION,
function(){
return $this->base->getLastPosts();
});
}
// другие методы практически такие же
}
Le amana'ia le fa'aoga Faletupe i le faufale. Mo nisi mafuaaga le iloa, na latou filifili e faaigoa le atinaʻe mo le faʻaogaina i Laravel i lenei auala.
Vasega CachedPostQueries fa'atino na'o le fa'aoga. $this->cache->manatua siaki pe o loʻo i totonu o le cache lenei faʻamatalaga ma afai e leai, ona valaʻau lea i tua ma tusi le tau toe faʻafoʻi i le cache. Pau lava le mea o loʻo totoe o le faʻatinoina o lenei vasega i totonu o le talosaga. Matou te manaʻomia vasega uma i totonu o le talosaga e talosagaina se faʻatinoga o le atinaʻe PostQueries na amata ona maua se faataitaiga o le vasega CachedPostQueries. Ae peitai, o ia lava CachedPostQueries e tatau i le faufale ona maua se vasega o se parakalafa EloquentPostQueriestalu ai e le mafai ona galue e aunoa ma se faʻatinoga "moni". Tatou te sui AppServiceProvider:
<?php
final class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(PostQueries::class,
CachedPostQueries::class);
$this->app->when(CachedPostQueries::class)
->needs(PostQueries::class)
->give(EloquentPostQueries::class);
}
}
O oʻu manaʻoga uma o loʻo faʻamatalaina masani i totonu o le kamupani. O lea, na matou faʻatinoina le faʻaogaina o a matou talosaga e ala i le tusiaina o le tasi vasega ma suia le faʻatulagaina o pusa. O le isi vaega o le numera o talosaga e leʻi suia.
O le mea moni, ina ia faʻatinoina atoatoa le caching, e tatau foʻi ona faʻatinoina le faʻaleaogaina ina ia le faʻapipiʻi le mea na tapeina i luga o le saite mo sina taimi, ae faʻamalo vave. Ae o mea laiti nei.
laina pito i lalo: matou te le faʻaaogaina se tasi, ae lua faʻataʻitaʻiga. Fa'ata'ita'iga Tu'ufa'atasiga o Tiutetauave ole Poloaiga (CQRS) e fa'atatau e tu'u'ese'ese atoatoa galuega faitau ma tusitusi i le tulaga fa'aoga. Na ou sau ia te ia e ala mai Fa'avae Fa'avae Va'aiga, lea e taʻu mai ai ou te faʻaogaina ma le atamai mamanu ma mataupu faavae ma maua mai le tasi mai le isi o se aʻoaʻoga :) Ioe, e le o galuega uma e manaʻomia se faʻaogaina mo le filifilia o vaega, ae o le a ou faʻasoa atu le togafiti ia te oe I le amataga o le faʻaoga atinae, e mafai lava ona e fatuina se vasega PostQueries faʻatasi ai ma le faʻatinoga masani e ala i le Eloquent:
<?php
final class PostQueries
{
public function getById($id): Post
{
return Post::findOrFail($id);
}
// другие методы
}
A tulaʻi mai le manaʻoga mo le faʻaogaina, faʻatasi ai ma se gaioiga faigofie e mafai ona e fatuina se atinaʻe (poʻo se vasega faʻapitoa) e suitulaga i lenei vasega PostQueries, kopi lona faatinoga i le vasega EloquentPostQueries ma alu i le polokalame na ou faamatalaina muamua. Ole isi vaega ole tusi talosaga e le mana'omia ona suia.
O nei togafiti uma ma vasega, fesoʻotaʻiga, Tui Faamoemoe и CQRS faamatalaina auiliili i
puna: www.habr.com