I kēlā pule aku nei ua kākau wau
<?php
interface PostRepository
{
public function getById($id): Post;
public function save(Post $post);
public function delete($id);
}
Eia nō naʻe, i nā papahana maoli, inā ua hoʻoholo ʻia e hoʻohana i nā waihona, hoʻohui pinepine ʻia nā ala no ka hoʻihoʻi ʻana i nā moʻolelo iā lākou:
<?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);
}
Hiki ke hoʻokō ʻia kēia mau ʻano ma o ka Eloquent scopes, akā ʻo ka hoʻonui ʻana i nā papa hui me ke kuleana o ke kiʻi ʻana iā lākou iho ʻaʻole ia ka manaʻo maikaʻi loa, a ʻo ka neʻe ʻana i kēia kuleana i nā papa waihona me he mea lā. Pela anei? Ua hoʻokaʻawale au i kēia interface i ʻelua ʻāpana. E hoʻohana ʻia ka hapa mua o nā ʻano hana i nā hana kākau.
ʻO ka hana kākau maʻamau:
- ke kūkulu ʻana i kahi mea hou a me ka paʻakikī PostRepository:: mālama
- PostRepository::getById, hoʻopunipuni a me ke kāhea ʻana PostRepository:: mālama
- ka pahuhopu PostRepository:: holoi
ʻAʻole hoʻohana nā hana kākau i nā ala kiʻi. Ma nā hana heluhelu, hoʻohana wale ʻia nā ala get*. Inā heluhelu ʻoe e pili ana Ke Kumu Hoʻokaʻawale Interface (leka I в HOLOMINA), a laila e ʻike ʻia he nui loa kā mākou interface a hana i ʻelua mau kuleana like ʻole. ʻO ka manawa kēia e puunaue i ʻelua. ʻano hana getById pono i nā mea ʻelua, akā i ka lilo ʻana o ka noi i mea paʻakikī, e ʻokoʻa kāna hoʻokō. E ʻike mākou i kēia ma hope iki. Ua kākau wau e pili ana i ka pono ʻole o ka ʻāpana kākau ma kahi ʻatikala ma mua, no laila ma kēia mea e poina wale ai au.
ʻAʻole he mea ʻole ka ʻāpana Heluhelu iaʻu, ʻoiai no ka Eloquent aia kekahi mau hoʻokō ma aneʻi. He aha ka inoa o ka papa? Hiki ReadPostRepository, akā i ke kumu hoʻohālike Ka Hale Paʻi ua liʻiliʻi kona pili. Hiki iā ʻoe wale nō PostQueries:
<?php
interface PostQueries
{
public function getById($id): Post;
public function getLastPosts();
public function getTopPosts();
public function getUserPosts($userId);
}
He mea maʻalahi ka hoʻokō ʻana me Eloquent:
<?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();
}
}
Pono e pili ka interface me ka hoʻokō, no ka laʻana ma AppServiceProvider:
<?php
final class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(PostQueries::class,
EloquentPostQueries::class);
}
}
Pono kēia papa. Hoʻomaopopo ʻo ia i kāna kuleana ma ka hoʻokuʻu ʻana i nā mea hoʻokele a i ʻole ka papa hui. I loko o kahi mea hoʻoponopono hiki ke hoʻohana ʻia e like me kēia:
<?php
final class PostsController extends Controller
{
public function lastPosts(PostQueries $postQueries)
{
return view('posts.last', [
'posts' => $postQueries->getLastPosts(),
]);
}
}
Palapala PostsController::lastPosts e noi wale ana i kekahi hoʻokō PostsQueries a hana pū me ia. Ma ka mea hoʻolako a mākou i hoʻopili ai PostQueries me ka papa EloquentPostQueries a e hoʻololi ʻia kēia papa i ka mea hoʻoponopono.
E noʻonoʻo kākou ua kaulana loa kā mākou noi. ʻO nā kaukani mea hoʻohana i kēlā me kēia minuke e wehe i ka ʻaoʻao me nā puke hou loa. Heluhelu pinepine ʻia nā puke kaulana loa. ʻAʻole mālama maikaʻi nā waihona i kēlā mau ukana, no laila hoʻohana lākou i kahi hopena maʻamau - kahi cache. Ma waho aʻe o ka waihona, mālama ʻia kekahi kiʻi ʻikepili i loko o kahi waihona i hoʻopaʻa ʻia no kekahi mau hana - memcached ai ole ia, ʻulaʻula.
ʻAʻole paʻakikī ka hoʻopaʻa ʻana i ka logic, akā ʻaʻole pololei loa ka hoʻokō ʻana iā ia ma EloquentPostQueries (inā wale nō Kumumanaʻo kuleana kuleana hoʻokahi). He mea maʻamau ka hoʻohana ʻana i ka laʻana ʻĀina a hoʻokō i ka caching i mea hoʻonani no ka hana nui:
<?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();
});
}
// другие методы практически такие же
}
E haʻalele i ke kikowaena Ka Hale Paʻi i ka mea hana. No kekahi kumu i ʻike ʻole ʻia, ua hoʻoholo lākou e inoa i ka interface no ka caching ma Laravel ma kēia ala.
Papa CachedPostQueries hoʻokomo i ka hoʻokomo wale ʻana. $this->cache->hoʻomanaʻo e nānā inā aia kēia komo i loko o ka waihona a inā ʻaʻole, a laila e kāhea i ka callback a kākau i ka waiwai i hoʻihoʻi ʻia i ka cache. ʻO nā mea i koe e hoʻokō i kēia papa i loko o ka noi. Pono mākou i nā papa āpau i ka noi e noi i kahi hoʻokō o ka interface PostQueries hoʻomaka ka loaʻa ʻana o kahi laʻana o ka papa CachedPostQueries. Eia naʻe, ʻo ia iho CachedPostQueries pono e loaʻa i ka mea kūkulu hale kahi papa ma ke ʻano he ʻāpana EloquentPostQueriesno ka mea ʻaʻole hiki ke hana me ka ʻole o ka hoʻokō "maoli". Hoʻololi mākou 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);
}
}
Ua wehewehe maoli ʻia kaʻu mau makemake a pau i ka mea hoʻolako. No laila, ua hoʻokō mākou i ka cache no kā mākou mau noi ma ke kākau ʻana i hoʻokahi papa a hoʻololi i ka hoʻonohonoho pahu. ʻAʻole i loli ke koena o ke code noi.
ʻOiaʻiʻo, no ka hoʻokō piha ʻana i ka caching, pono nō hoʻi e hoʻokō i ka invalidation i ʻole e kau ka ʻatikala i holoi ʻia ma ka pūnaewele no kekahi manawa, akā holoi koke ʻia. Akā he mau mea liʻiliʻi kēia.
Ke laina lalo: ʻaʻole mākou i hoʻohana i hoʻokahi, akā ʻelua mau mamana. Laʻana ʻO ka hoʻokaʻawale ʻana i ke kuleana nīnau nīnau (CQRS) manaʻo ʻo ia e hoʻokaʻawale loa i nā hana heluhelu a kākau ma ka pae interface. Ua hele au iā ia ma o Ke Kumu Hoʻokaʻawale Interface, ʻo ia ka mea e hōʻike ana e hoʻomaʻamaʻa akamai wau i nā mamana a me nā loina a loaʻa kekahi mai kekahi ma ke ʻano he theorem :) ʻOiaʻiʻo, ʻaʻole pono kēlā me kēia papahana i kahi abstraction no ke koho ʻana i nā hui, akā e kaʻana aku au i ka hoʻopunipuni me ʻoe. hoʻomohala, hiki iā ʻoe ke hana i kahi papa PostQueries me ka hoʻokō maʻamau ma o Eloquent:
<?php
final class PostQueries
{
public function getById($id): Post
{
return Post::findOrFail($id);
}
// другие методы
}
Ke kū mai ka pono no ka caching, me kahi neʻe maʻalahi hiki iā ʻoe ke hana i kahi interface (a i ʻole ka papa abstract) ma kahi o kēia papa. PostQueries, kope i kona hoʻokō ʻana i ka papa EloquentPostQueries a hele i ka papahana aʻu i wehewehe mua ai. ʻAʻole pono ke hoʻololi ʻia ke koena o ke code noi.
ʻO kēia mau hana hoʻopunipuni āpau me nā papa, nā interface, Pākuʻi dependence и CQRS wehewehe kikoʻī ma
Source: www.habr.com