Symfony kurzus 2014/2015 I. félév Controller, Routing
Request - Response GET / HTTP/1.1 Host: xkcd.com Accept: text/html User-Agent: Mozilla/5.0 (Macintosh) HTTP/1.1 200 OK Date: Sat, 02 Apr 2011 21:05:05 GMT Server: lighttpd/1.4.19 Content-Type: text/html <html> <!--... HTML for the xkcd comic --> </html>
Request Response PHP- ban $uri = $_SERVER['REQUEST_URI']; $foo = $_GET['foo']; header('content-type: text/html'); echo 'The URI requested is: '.$uri; echo 'The "foo" value is: '.$foo;
Request Symfony- ban // retrieve GET and POST variables respectively $request->getpathinfo(); $request->query->get('foo'); $request->request->get('bar', 'default value'); // retrieve SERVER variables $request->server->get('http_host'); // retrieves an instance of UploadedFile $request->files->get('foo'); // retrieve a COOKIE value $request->cookies->get('phpsessid'); // retrieve an HTTP request header, with normalized, lowercase keys $request->headers->get('host'); $request->headers->get('content_type'); // GET, POST, PUT, DELETE, HEAD $request->getmethod(); // an array of languages the client accepts $request->getlanguages();
Response Symfony- ban use Symfony\Component\HttpFoundation\Response; $response = new Response(); $response->setcontent( <html><body><h1>hello world!</h1></body></html>'); $response->setstatuscode(response::http_ok); $response->headers->set('content-type', 'text/ html'); - A Response egy Symfony objektum - Lényegében bármilyen értelmezhető kimenet lehet - HTML, XML, JSON, kép, redirect, stb.
Request útja 1. Front controller kap egy kérést 2. A kernel továbbítja a megfelelő controllerhez 3. A controller feldolgozza a kérést 4. A controller előállítja a választ 5. A választ továbbítjuk a felhasználóhoz
Helye általában PeldaBundle/Controller Controller Egy controller több feladatot lát el Ezekhez a feladatokhoz úgynevezett action -t fogunk definiálni Egy-egy action fogja a kérést válasszá alakítani Elnevezése: bundle:controller:action AcmeBlogBundle:Blog:show AcmeBlogBundle Blog controller showaction metódus
Egyszerű controller //src/acme/hellobundle/controller/hellocontroller.php namespace Acme\HelloBundle\Controller; use Symfony\Component\HttpFoundation\Response; class HelloController { public function indexaction($name) { return new Response('<html><body>Hello '.$name.'!</body></html>'); } }
Gyakori controller feladatok Redirect: return $this->redirect( ); $this->generateurl('homepage') Forward: $response = $this->forward( AcmeHelloBundle:Hello:fancy', array( )); 'name' => $name, 'color' => 'green', return $response;
Gyakori controller feladatok Template renderelés: // Resources/views/Hello/index.html.twig $content = $this->renderview( 'AcmeHelloBundle:Hello:index.html.twig', ); array('name' => $name) return new Response($content); Symfony service-ek elérése: $request = $this->getrequest(); $templating = $this->get('templating'); $router = $this->get('router'); $mailer = $this->get('mailer');
Gyakori controller feladatok Flashbag üzenetek megjelenítése: public function updateaction() { $form = $this->createform(...); $form->bind($this->getrequest()); if ($form->isvalid()) { // do some sort of processing $this->get('session') ->getflashbag() ->add('notice', 'Message'); return $this->redirect( $this->generateurl(...) ); } return $this->render(...); }
Response // create a simple Response with a 200 status code (the default) $response = new Response('Hello '. $name, 200); // create a JSON-response with a 200 status code $response = new Response( json_encode(array('name' => $name)) ); $response->headers->set('content-type', 'application/json');
RouCng Hogyan kössük össze a Requestet a megfelelő controller funkcióval? Route-ok segítségével meghatározzuk, hogy melyik URL-hez melyik controller action fut le Definiálása több helyen és módon lehetséges: Globálisan: app/config/routing.(yml xml php) Lokálisan: annotációk segítségével
Blog példa: blog: path: /blog/{page} defaults: { _controller: Globális roucng AcmeBlogBundle:Blog:index, page: 1 } methods: [GET] requirements: page: \d+
Annotációk Lokális roucng PHP komment blokkban definiált funkciók class PostController extends Controller { /** * @Route("/{id}", requirements={"id" = "\d+"}, name="blog") * @Route("/", defaults={"id" = 1}) */ public function indexaction($id) { //... } } Szükséges globális config: app/config/routing.yml post: resource: "@AcmeBlogBundle/Controller/ PostController.php" type: annotation
Route prefix Annotációk esetén az osztály annotációjában definiálhatóak /** * @Route("/blog") */ class PostController extends Controller { /** * @Route("/edit/{id}", name="blog_edit") * @Method({"GET", "POST"}) */ public function editaction($id) { } }