2009-12-30 3 views
1

В настоящее время я работаю над небольшим приложением с моделями, картами и контроллерами. Мой вопрос в том, что (потому что я не нашел ответа на какой-либо ответ), как с ним взаимодействует картатор (& контроллер), когда у нас возникает следующая ситуация.Model & Mapper relationship

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

Это будет работать так хорошо, насколько это возможно, модель имеет идентификатор, с которым преобразователь может извлекать необходимые пользователю (и карта его обратно в объект пользователя).

Моя проблема заключается в том, как я могу обернуть этот код, я имею в виду, этот код очень сырой, и определенно не рекомендуется использовать его в контроллере. Я хочу, чтобы сократить его, но я не знаю точно, как:

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

Он должен выглядеть как:

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

Но это гораздо больше кода. Должен ли я включать процедуру getMapper в класс родительского контроллера, поэтому я могу легко получить доступ к $this->_mapper без явного вызова?

Проблема заключается в том, что я не хочу разорвать шаблон сопоставления, поэтому Модель не должна обращаться к любому методу SQL/Mapper напрямую с помощью $model->find(), но я не хочу иметь много кода только для первого создания mapper и делать это и т. д.

Надеюсь, вы меня немного поймете, я уже достаточно смущен, потому что я новичок во многих шаблонах и методах отображения/моделирования.

+1

Не имеет смысла сразу следовать шаблону;) просто делайте все, что вам удобно. Шаблоны должны сэкономить ваше время и помочь вам разобраться, как решить что-то, но они не являются религией, за которой вы должны следовать. – openfrog

ответ

1

Вы можете добавить Service Layer, например.

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

Ваш контроллер не будет обращаться к UserModel и UserMapper напрямую, а через службу.

+0

Спасибо;), но мне еще нужно вызвать класс Service (ы) в моем контроллере. –

+1

Я не уверен, что я понимаю, каков ваш вопрос? Вы ищете инъекцию зависимостей, например. http://components.symfony-project.org/dependency-injection/ – Gordon

+0

Да, это тоже помогло мне, большое спасибо;) –

Смежные вопросы