2009-12-30 6 views
1

Je travaille actuellement sur une petite application avec des modèles, des mappeurs et des contrôleurs. Ma question est, (parce que je n'ai trouvé aucune réponse correspondante), comment le mappeur interagit avec le modèle (& le contrôleur), lorsque nous avons la situation suivante.Relations Model & Mapper

$user = new UserModel(); 
$user->setId('21'); 
$userMapper = new UserMapper($user); 
$userMapper->retrieve(); 

Cela fonctionne aussi bien que possible, le modèle a un id avec lequel le mappeur peut récupérer l'utilisateur nécessaire (et la carte nouveau dans un objet utilisateur).

Mon problème est, comment puis-je envelopper ce code, je veux dire, ce code est très cru et il n'est certainement pas très recommandé d'être utilisé dans un contrôleur. Je veux raccourcir, mais je ne sais pas exactement comment:

public function view($id) 
{ 
    $user->find($id); // this seems always to be tied with the user object/model (e.g. cakephp), but I think the ->find operation is done by the mapper and has absolutly nothing to do with the model 
    $view->assign('user',$user); 
} 

Il devrait ressembler davantage:

public function view($id) 
{ 
    $mapper = $registry->getMapper('user'); 
    $user = $mapper->find($id); 
    // or a custom UserMapper method: 
    # $user = $mapper->findById($id); 
    $view->assign('user',$user); 
} 

Mais ce code est beaucoup plus. Dois-je inclure la procédure getMapper dans la classe de contrôleur parent, afin que je puisse facilement accéder à $this->_mapper sans l'appeler explicitement? Le problème est, je ne veux pas casser le modèle de mappeur, de sorte que le modèle ne doit pas accéder directement à toute méthode SQL/Mappeur par $model->find(), mais je ne veux pas avoir beaucoup de code juste pour créer un mapper et faire ceci et cela etc

J'espère que vous me comprendrez un peu, moi-même est déjà assez confus, parce que je suis nouveau à de nombreux modèles et techniques de cartographie/modélisation.

+1

Cela n'a aucun sens de suivre un modèle tout de suite;) faites simplement ce qui vous convient le mieux. Les patrons devraient vous faire gagner du temps et vous aider à trouver une solution, mais ce n'est pas une religion à suivre. – openfrog

Répondre

1

Vous pouvez ajouter un Service Layer, par ex.

class UserService 
{ 
    public function findUserById($id) 
    { 
     // copied and adjusted from question text 
     $user = new UserModel(); 
     $user->setId($id); 
     $userMapper = new UserMapper($mapper); 
     return $userMapper->retrieve(); 
    } 
} 

Votre contrôleur n'a pas accès directement au UserModel et au UserMapper, mais via le Service.

+0

Merci;) mais je dois encore appeler la classe Service (es) au sein de mon contrôleur. –

+1

Je ne suis pas sûr de comprendre votre question alors? Recherchez-vous l'injection de dépendance, par ex. http://components.symfony-project.org/dependency-injection/ – Gordon

+0

Oui, cela m'a aidé aussi, merci beaucoup;) –