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.