Libaka tsa polokelo tse nang le Eloquent?

Bekeng e fetileng ke ngotse sengoloa se mabapi le ho hloka thuso ha template ea Repository bakeng sa mekhatlo e Bohlale, leha ho le joalo, o ile a ntšepisa hore o tla mpolella hore na nka e sebelisa ka mokhoa o sa fellang molemong oa hae. Ho etsa sena, ke tla leka ho sekaseka hore na template ena hangata e sebelisoa joang mererong. Bonyane sete e hlokahalang ea mekhoa bakeng sa polokelo:

<?php
interface PostRepository
{
    public function getById($id): Post;
    public function save(Post $post);
    public function delete($id);
}

Leha ho le joalo, mererong ea 'nete, haeba ho ile ha etsoa qeto ea ho sebelisa li-repositories, mekhoa ea ho fumana litlaleho hangata e ekeletsoa ho bona:

<?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);
}

Mekhoa ena e ka kengoa ts'ebetsong ka mekhoa e Bohlale, empa lihlopha tsa mekhatlo e imelang haholo ka boikarabello ba ho ipatlela ha se mohopolo o motle, 'me ho isa boikarabello bona litlelaseng tsa polokelo ho bonahala ho utloahala. Na ho joalo? Ka ho khetheha ke ile ka arola sebopeho sena ka likarolo tse peli. Karolo ea pele ea mekhoa e tla sebelisoa ts'ebetsong ea ho ngola.

Ts'ebetso e tloaelehileng ea ho ngola ke:

  • kaho ya ntho e ncha le phephetso PostRepository:: boloka
  • PostRepository::getById, ho qhekella le ho bitsa mokhatlo PostRepository:: boloka
  • phephetso PostRepository:: hlakola

Ts'ebetso ea ho ngola ha e sebelise mekhoa ea ho lata. Ts'ebetsong ea ho bala, ho sebelisoa mekhoa ea get* feela. Haeba u bala ka Molao-motheo oa Karohano ea Sebopeho (lengolo I в TIISETSE), joale ho tla hlaka hore sebopeho sa rona se seholo haholo 'me se etsa bonyane boikarabelo bo bong bo fapaneng. Ke nako ea ho e arola ka bobeli. Mokhoa getById ea hlokahala ka bobeli, empa ha kopo e ntse e rarahana le ho feta, ts'ebetsong ea eona e tla fapana. Re tla bona sena hamorao. Ke ngotse ka ho hloka thuso ha karolo e ngotsoeng sehloohong se fetileng, kahoo ho sena ke tla lebala ka eona feela.

Karolo ea Read e bonahala ho 'na e se na thuso, kaha esita le bakeng sa Eloquent ho ka ba le ts'ebetsong tse' maloa mona. Ho reha sehlopha eng? Ka ReadPostRepository, empa ho template Repository o se a na le bohlokoa bo fokolang. U ka khona feela PostQueries:

<?php
interface PostQueries
{
    public function getById($id): Post;
    public function getLastPosts();
    public function getTopPosts();
    public function getUserPosts($userId);
}

Ho e sebelisa ka Eloquent ho bonolo haholo:

<?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();
    }
}

Sehokelo se tlameha ho amahanngoa le ts'ebetsong, mohlala ho AppServiceProvider:

<?php
final class AppServiceProvider extends ServiceProvider 
{
    public function register()
    {
        $this->app->bind(PostQueries::class, 
            EloquentPostQueries::class);
    }
}

Sehlopha sena se se se ntse se le molemo. O hlokomela boikarabelo ba hae ka ho imolla balaoli kapa sehlopha sa mokhatlo. Ho controller e ka sebelisoa tjena:

<?php
final class PostsController extends Controller
{
    public function lastPosts(PostQueries $postQueries)
    {
        return view('posts.last', [
            'posts' => $postQueries->getLastPosts(),
        ]);
    }
} 

Mokhoa PostsController::lastPosts ke kopa feela ho kenngwa tshebetsong ho itseng PostsQueries 'me e sebetsa le eona. Ho mofani oa thepa eo re e kopantseng PostQueries le sehlopha EloquentPostQueries 'me sehlopha sena se tla nkeloa sebaka ke molaoli.

Ha re nahane hore kopo ea rona e se e tumme haholo. Basebelisi ba likete ka motsotso ba bula leqephe ka lingoliloeng tsa morao-rao. Lingoliloeng tse tsebahalang haholo le tsona li baloa khafetsa. Li-database ha li tšoare meroalo e joalo hantle, kahoo li sebelisa tharollo e tloaelehileng - cache. Ntle le database, snapshot e itseng ea data e bolokiloe polokelong e ntlafalitsoeng bakeng sa ts'ebetso e itseng - hopotsoe kapa redis.

Caching logic hangata ha e thata hakaalo, empa ho e kenya ts'ebetsong ho EloquentPostQueries ha e nepahale haholo (haeba ke hobane feela Molao-motheo oa Boikarabello bo le Mong). Ke ntho ea tlhaho ho feta ho sebelisa template Mokhabisi 'me u sebelise caching joalo ka mokhabiso bakeng sa ketso ea mantlha:

<?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();
            });
    }

    // другие методы практически такие же
}

Hlokomoloha sebopeho Repository moahing. Ka mabaka a sa tsejoeng, ba ile ba etsa qeto ea ho reha sebopeho sa caching ho Laravel ka tsela ena.

Sehlopha CachedPostQueries lisebelisoa tsa caching feela. $ ena-> cache-> hopola e hlahloba hore na kenyo ena e ka har'a cache 'me haeba ho se joalo, ebe callback ebe e ngola boleng bo khutlisitsoeng ho cache. Ho setseng ke ho kenya tšebetsong sehlopha sena ts'ebelisong. Re hloka lihlopha tsohle tse ka kopo ho kopa ts'ebetsong ea sebopeho PostQueries a qala ho fumana mohlala oa sehlopha CachedPostQueries. Leha ho le joalo, eena ka boeena CachedPostQueries sehahi se tlameha ho amohela sehlopha joalo ka parameter EloquentPostQuerieskaha e ke ke ea sebetsa ntle le ts'ebetsong ea "sebele". Rea fetoha 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);
    }
}

Litakatso tsa ka kaofela li hlalositsoe ka tlhaho ho mofani oa thepa. Kahoo, re sebelisitse caching bakeng sa likopo tsa rona feela ka ho ngola sehlopha se le seng le ho fetola tlhophiso ea setshelo. Karolo e setseng ea khoutu ea kopo ha e so fetohe.

Ehlile, ho kenya ts'ebetsong caching ka botlalo, ho boetse hoa hlokahala ho kenya ts'ebetsong ho se sebetse e le hore sengoloa se tlositsoeng se se ke sa fanyeha setšeng ka nako e itseng, empa se hlakoloe hanghang. Empa tsena ke lintho tse nyane.

Ntlha ea bohlokoa: ha rea ​​sebelisa e le 'ngoe, empa li-template tse peli. Mohlala Command Query Responsibility Segregation (CQRS) e sisinya ho arola ka botlalo ts'ebetso ea ho bala le ho ngola maemong a sebopeho. Ke tlile ho eena ka Molao-motheo oa Karohano ea Sebopeho, e fanang ka maikutlo a hore ke sebelisa mekhoa le melao-motheo ka bohlale 'me ke fumana e' ngoe ho e 'ngoe e le theorem :) Ha e le hantle, ha se morero o mong le o mong o hlokang mokhoa o joalo oa ho khetha mekhatlo, empa ke tla arolelana le uena leqheka. ntshetsopele, o ka theha sehlopha feela PostQueries ka ts'ebetsong e tloaelehileng ka Eloquent:

<?php
final class PostQueries
{
    public function getById($id): Post
    {
        return Post::findOrFail($id);
    }

    // другие методы
}

Ha tlhoko ea caching e hlaha, ka ts'ebetso e bonolo u ka theha sebopeho (kapa sehlopha sa abstract) sebakeng sa sehlopha sena. PostQueries, kopitsa ts'ebetsong ea eona ho sehlopha EloquentPostQueries 'me u ee ho morero oo ke o hlalositseng pejana. Karolo e setseng ea khoutu ea kopo ha e hloke ho fetoloa.

Maqheka ana kaofela a nang le lihlopha, li-interfaces, Ente ea ho itšepa и CQRS e hlalositsoe ka botlalo ka buka ea ka "Architecture of Complex Web Applications". Hape ho na le tharollo ea selotho hore na hobaneng litlelase tsohle tsa ka mehlaleng ea sengoloa sena li tšoailoe e le tsa ho qetela.

Source: www.habr.com

Eketsa ka tlhaloso