После прочтения большого количества сообщений и ресурсов, у меня все еще есть некоторые проблемы с известным вопросом о том, "где поставить бизнес-логику"? Чтение qaru.site/info/236277/... и Сообщение в блоге, я считаю, что понял эту проблему хорошо разделяемого кода.
Предположим, у меня есть веб-форма, где вы можете добавить пользователя, который будет добавлен в db. Этот пример включает в себя следующие понятия:
- Форма
- контроллер
- Entity
- Сервис
- Repository
Если я ничего не пропустил, вам нужно создать сущность с некоторыми свойствами, геттерами, сеттерами и т.д., чтобы он сохранялся в db. Если вы хотите получить или записать этот объект, вы будете использовать entityManager
и для "неканонического" запроса entityRepository
(то есть, где вы можете поместить свой запрос "запрос" ).
Теперь вам нужно определить службу (то есть класс PHP с "ленивым" экземпляром) для всей бизнес-логики; это место, где можно поставить "тяжелый" код. После того, как вы зарегистрировали услугу в своем приложении, вы можете использовать ее почти везде, и это связано с повторным использованием кода и т.д.
При рендеринге и отправке формы вы связываете ее с вашей сущностью (и с ограничениями, конечно), и используйте все понятия, определенные выше, чтобы собрать все вместе.
Итак, "old-me" будет писать действие контроллера таким образом:
public function indexAction(Request $request)
{
$modified = False;
if($request->getMethod() == 'POST'){ // submit, so have to modify data
$em = $this->getDoctrine()->getEntityManager();
$parameters = $request->request->get('User'); //form retriving
$id = $parameters['id'];
$user = $em->getRepository('SestanteUserBundle:User')->find($id);
$form = $this->createForm(new UserType(), $user);
$form->bindRequest($request);
$em->flush();
$modified = True;
}
$users = $this->getDoctrine()->getEntityManager()->getRepository('SestanteUserBundle:User')->findAll();
return $this->render('SestanteUserBundle:Default:index.html.twig',array('users'=>$users));
}
"New-me" имеет реорганизованный код следующим образом:
public function indexAction(Request $request)
{
$um = $this->get('user_manager');
$modified = False;
if($request->getMethod() == 'POST'){ // submit, so have to modify data
$user = $um->getUserById($request,False);
$form = $this->createForm(new UserType(), $user);
$form->bindRequest($request);
$um->flushAll();
$modified = True;
}
$users = $um->showAllUser();
return $this->render('SestanteUserBundle:Default:index.html.twig',array('users'=>$users));
}
Где $um
- это настраиваемая услуга, в которой сохраняется весь код, который вы не видите из фрагмента кода # 1 с номером кода # 2.
Итак, вот мои вопросы:
- Получил ли я, наконец, сущность symfony2 и {M} VC вообще?
- Является ли рефактор хорошим? Если нет, то что было бы лучше?
Post Scriptum. Я знаю, что я могу использовать хранилище FOSUserBundle для пользователя и аутентификацию, но это основной пример, чтобы научить себя работе с Symfony. Кроме того, моя служба была введена ORM.Doctrine. * Для работы (просто записка для тех, кто читал этот вопрос с той же путаницей)