Symfony2 controller
A bundle generálás során már létrejöttek a controllerek és amikor az entity-ket generáltuk, akkor a model -hez tartozó fájlok is létrejöttek. Most először a controllereket nézzük meg közelebbről majd a következő bejegyzésben az entity-ket. |
|
A bundle-jeinkben lévő Controller mappában találhatjuk a controllerjeink fájljait. Minden metódushoz deklerálhatunk annotációkat, amikkel beállíthatunk paramétereket. Pl megadjuk a route útvonalat vagy hogy POST vagy GET metódust szeretnénk-e vagy hogy melyik twig-es template fájlt szeretnénk használni. Használjuk a névtereket is a munka megkönnyítésére. Az első példában a news controllert fogjuk megnézni, amiből csak a indexAction metódust emeltem ki, mert amúgy nagyon hosszú lett vona a példa. Ez listázza a tábla összes elemét, az összes hírt listázzuk és oldalakra bontjuk a bejegyzéseket (pagina). A kezdeti deklarációk és inicializáció után egyszerűen csak lekérdezzük az összes hírt és megszámoljuk őket. Majd újra listázzuk a tábla tartalmát, de már csak azt az oldalt, amire szükségünk van. Direkt hagytam a kódban felesleges kikommentelt sorokat, hátha jól jön még :) <?php namespace Web\NewsBundle\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Web\NewsBundle\Entity\News; use Web\NewsBundle\Form\NewsType; use Web\NewsBundle\Helper\PaginationHelper; /** * News controller. * * @Route("/news") */ class NewsController extends Controller { /** * Lists all News entities. * * @Route("/{page}", name="news") * @Method("GET") * @Template() */ public function indexAction($page) { $pagina = array(); $em = $this->getDoctrine()->getManager(); $entities = $em->getRepository('WebNewsBundle:News')->findAll(); // összes hír lekérdezése $count_entities=count($entities); // megszámoljuk, hogy mennyi bejegyzésünk van unset($entities); // lekérdezzük újra a news táblát, de csak annyi bejegyzést, amennyi az aktuális($page) oldalon van $entities = $em->getRepository('WebNewsBundle:News')//->findAll()->setMaxResults(5)->setFirstResult(2); ->findBy( array(), // $where 'age' => 20 array(), // $orderBy 'name' => 'ASC' 10, // $limit $page*10 // $offset ); $pagina = new PaginationHelper(); $pagina = $pagina->pagina($page,$count_entities); // összeállítjuk a lapozáshoz a tömböt return array( 'entities' => $entities, 'pagina' => $pagina, ); } ... Nézzünk még egy rövid példát, a NewsGroupController-ből. Ez a példa arra lesz jó, hogy hogyan szúrhatunk be új rekordot az adatbázisba: ... /** * Creates a new NewsGroup entity. * * @Route("/", name="newsgroup_create") * @Method("POST") * @Template("WebNewsBundle:NewsGroup:new.html.twig") */ public function createAction(Request $request) { $entity = new NewsGroup(); $form = $this->createCreateForm($entity); $form->handleRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($entity); $em->flush(); return $this->redirect($this->generateUrl('newsgroup_show', array('id' => $entity->getId()))); } return array( 'entity' => $entity, 'form' => $form->createView(), ); } /** * Creates a form to create a NewsGroup entity. * * @param NewsGroup $entity The entity * * @return \Symfony\Component\Form\Form The form */ private function createCreateForm(NewsGroup $entity) { $form = $this->createForm(new NewsGroupType(), $entity, array( 'action' => $this->generateUrl('newsgroup_create'), 'method' => 'POST', )); $form->add('submit', 'submit', array('label' => 'Create')); return $form; } /** * Displays a form to create a new NewsGroup entity. * * @Route("/new", name="newsgroup_new") * @Method("GET") * @Template() */ public function newAction() { $entity = new NewsGroup(); $form = $this->createCreateForm($entity); return array( 'entity' => $entity, 'form' => $form->createView(), ); } ... A Form mappában találjuk a NewsGroupType.php fájlt, amiben a formok elkészítéséhez írhatunk metódusokat. <?php namespace Web\NewsBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class NewsGroupType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('groupName') ; } /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Web\NewsBundle\Entity\NewsGroup' )); } /** * @return string */ public function getName() { return 'web_newsbundle_newsgroup'; } } http://symfony.com/doc/current/book/controller.html |
2014.11.30. |
Figyelem! Az itt olvasható leírások, nem teljesek és nem biztos, hogy pontosak. Nem
frissülnek folyamatosan, ezért nem mindegyik használható az aktuális verziójú rendszerekben. Mindenki saját
felelősségére használja az itt található ötleteket. Az esetleges károkért nem vállalunk felelősséget.