Multiple Service Layer and Repository Pattern managed with Events -


i know topic regarting service layer , repository pattern, "i still haven't found i'm looking for" ( u2 docet ... )

i'm working complex application dozen of services , repositories; pattern, show example, this:

controller $return = $this->getuserservice()->findall();  class userservice public function findall() return $this->getuserrepository()->findall();  class userrepository /** *  * @return collection of usermodel */ public function findall(){ $sql = "select * `user` ";         return $this->fetchall($sql); } 

so, every table in database, there these entities:

{entity}service {entity}repository {entity}model 

in controller, have collection of usermodel objects, returned repository layer through service layer.

all sounds good, until work single table; how work if have work multiple services/repositories?

1) question number 1

let want send email after operation , increase stats; in controller, probabply in service layer better, cause in service layer should add business logic.

so write:

controller     $this->getuserservice()->dosomething($params);  class userservice     public function dosomething($params);      $ok = $this->getuserrepository()->do($params);     $this->getmailservice()->sendemail($params);     $this->getstatsservice()->updatestats($params);      return true; 

in way, have add many services access single service; right? if these 3 operations strictly correlated , right way cause can move service method elsewhere without problems ( api context, web context), , operations remanin intact. problem have inject services within userservice, example using service container. think? how proceed if have perform many operations together? use controller instead?

2) question 2

i have collection of usermodels fetched pattern ( controller > service > repository > service > controller) let have usermodel dependency, example list of posts written user, , want able load list of posts in lazy way.

how can archieve this? user repository has returned rows user table database, , don't want add joins, cause not want load posts @ every request. problem post models belongs service > repository ( postservice , postrepository )

i solve problems using events; basically, every requests dependency object fire event.

class usermodel     protected $posts = null;      public function setposts($posts)     $this->posts = $posts;      public function getposts()         if(is_null($this->posts))             $this->loadposts();         return $this->posts;      protected function loadpost()         event::trigger(event::load_post,['targetmodel' => $this]);  controller      $users = $this->getuserservice()->findall();     foreach($users $user){         $posts = $user->getposts();     }     ...   $eventemitter->on(event::load_post, function(event $e) {     $targetmodel = $e->getdata('targetmodel');     if (!method_exists($targetmodel, 'setposts')) {         return false;     }     $posts = $e->getcontainer()     ->get('post-service')     ->findbyuserid($targetmodel->getuserid());     $targetmodel->setposts($posts);     return true; }); 

basically, when ask list of posts model , related model property null ( not empty, null ), trigger event, passing object i'm in. trigger call function has been registered during application bootstrap, call right services , call targetmodel setter load objects.

in way, solve many problems; can separate services , avoid many services within other services. can reuse code; let have many entities $posts, can create posttrait property , setter , getter, , use in entities has manage list of posts.

what think solution? if there way load object different repository in lazy way, without mixing repositories, tell me!

thanks in advance!


Comments

Popular posts from this blog

php - Permission denied. Laravel linux server -

google bigquery - Delta between query execution time and Java query call to finish -

python - Pandas two dataframes multiplication? -