FAQ |
Kalender |
|
![]() |
#1 | ||
|
|||
Administratör
|
Vad är det för modell som bör vara ansvarig för att skicka mail är min första fundering. Lite fler funderingar med lite kod;
Kod:
/* skapa objekt av ditt request för att göra request-hanteringen testbar, går att "sno" direkt av t ex Symfony2 eller ZF2 */ public function index(Request $request) { $model = new Model($request->get('this'), $request->get('that')); // this & that är query strings modellen hanterar $model = $this->createModel('Model'); /* Om dina models t ex behöver databas blir det lite fulare. I detta exempel skulle en DI container som satts från ControllerFactory kunna injectas via setter till modellen om den har en viss property eller har en setter för DBn. Använd hellre en repository klass framför som spottar ut modellen. */ /* 'mailer' bör läggas till i service locatorn av din controller factory i ditt exempel. Men den bör EJ initieras då den säkerligen inte används till alla requests, det görs lättast med closures. Pimple för en väldigt lättviktig DI container med closures och shared instances. */ $this->get('mailer')->send($model->getTitle(), $model->getText()); }
__________________
eldefors.com - Personlig (teknik)-blogg Senast redigerad av Clarence den 2013-03-11 klockan 18:42 Anledning: Dum indentering av kommentarer. |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Medlem
|
Citat:
När jag menar model menar jag mer ett "lager" , låt säga ett "Service lager" och inte en egentlig model klass. Citat:
Anta att man vill skapa en användare i db och samtidigt skicka ett mail. (Nu blir ju model ett litet missvisande namn kanske..) Kod:
//antar detta är en metod som inte ligger i controllern men på ett lämpligt ställe, en separat ControllerFactory klass(?) public function createModel($name) { if($name=='UserService') { return new UserService( new UserRepository( new DB() ) , Mailer::getInstance() ); //nu är inte pimple använt } } //och sedan index metoden public function index(Request $request) { $model = $this->createModel('UserService'); $user = new User($request->get('username'), $request->get('userpassword')); $model->registerUser( $user ); //denna använder repository och mail klassen ) |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Administratör
|
Citat:
Att ha en if-clause på klassnamnet i controllern blir lätt väldigt bloated, if-listor/switch statements växer ALLTID. En idé är att du dels använder en container för dina dependencies som du skickar in till controllern. Sedan har du i userService t ex en publik lista på vad du vill skicka in t ex array('db', 'mailer') som är keys i din DI container. Det finns givetvis snyggare sätt, men det är ett enkelt sätt att komma runt väldigt mycket if/switch-satser. Se t ex Symfony 2 för ett otroligt smidigt och flexibelt system för det. Jag är dock tveksam till hur decoupled just den komponenten är. Det andra problemet är ditt sätt att använda Mailer (singleton) och db (intern konfiguration). Felet med både förklaras bättre i ett tal av ZFs lead developer; https://speakerdeck.com/weierophinne...tiful-software Tror du har video på hans sajt också, men den verkar nere när jag skriver det här.
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
Svara |
|
|