Citat:
Ursprungligen postat av Clarence
Vad är det för modell som bör vara ansvarig för att skicka mail är min första fundering.
|
Ja det var ett dumt exempel, vad jag var ute efter var väl principen att en "model" kan göra flera saker tex maila och spara i db m.m.
När jag menar model menar jag mer ett "lager" , låt säga ett "Service lager" och inte en egentlig model klass.
Citat:
Ursprungligen postat av Clarence
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());
}
|
Ok , om jag spinner vidare på ditt exempel,
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
)
Är detta korrekt rent principellt? hmm nu är väl kanske inte Service locator använt ..