Un semplice esempio per creare un Controller Multipagina per gestire contenuti dinamici in un template .twig
1. app\Resources\views\base.html.twig
<!-- app\Resources\views\base.html.twig --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>{% block title %}Welcome to my Company{% endblock %}</title> {% block stylesheets %}{% endblock %} <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" /> </head> <body> {% block body %}{% endblock %} {% block javascripts %}{% endblock %} </body> </html>
2. app\Resources\views\index.html.twig
{# app\Resources\views\index.html.twig #} {% extends 'base.html.twig' %} {% block body %} <h1>This is one page</h1> <strong>This is the page: {{pagetitle}}</strong> <br> {{navigationmenu | raw }} <br> <a href="#">Visit My company</a> <br> {{pagecontent}} {% endblock %} {% block stylesheets %} <style> h1 { font-size: 36px; } </style> {% endblock %}
3. src\AppBundle\Controller\MyCompanyController.php
<?php //src\AppBundle\Controller\MyCompanyController.php namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; // namespace for route use Symfony\Component\HttpFoundation\Response; // namespace for http render use Symfony\Bundle\FrameworkBundle\Controller\Controller; // to extend Controller class MyCompanyController extends Controller { // proprietà comuni // protected perchè non vogliamo che venga modificata dall'esterno protected $menu = '<strong>The Navigation Bar:</strong><br>' . '<a href="/">Home</a><br>' . '<a href="aboutus">About Us</a><br>' . '<a href="services">Services</a><br>' . '<a href="contactus">Contact Us</a>' ; /** * @Route("/") */ public function homeAction() // sempre suffisso ...Action { // send the variable to a .twig template return $this->render('index.html.twig', array( 'navigationmenu' => $this->menu, //$this è la sintassi per usare le proprietà 'pagetitle' => 'Home', 'pagecontent' => 'Content of Home', )); }// END home ------------------------------------------------------------ /** * @Route("/aboutus") */ public function aboutUsAction() // sempre suffisso ...Action { $number = mt_rand(0, 100); // this is plain PHP // send the variable to a .twig template return $this->render('index.html.twig', array( 'navigationmenu' => $this->menu, 'pagetitle' => 'About Us', 'pagecontent' => 'Content of About Us and a number RNG '. $number, )); }// END aboutus ---------------------------------------------------------- /** * @Route("/services") */ public function servicesAction() // sempre suffisso ...Action { // send the variable to a .twig template return $this->render('index.html.twig', array( 'navigationmenu' => $this->menu, 'pagetitle' => 'Services', 'pagecontent' => 'Content of Services', )); }// END services --------------------------------------------------------- /** * @Route("/contactus") */ public function contactUsAction() // sempre suffisso ...Action { // send the variable to a .twig template return $this->render('index.html.twig', array( 'navigationmenu' => $this->menu, 'pagetitle' => 'Contact Us', 'pagecontent' => 'Content of Contact Us', )); }// END contacUs --------------------------------------------------------- }// END class MyCompanyController
Puntare il browser alla homepage a: http://localhost/symfonytest/first_test_symfony/web/
Come funziona?
1. MyCompanyController.php
a. creo una proprietà ‘protected’ perchè non voglio che sia modificabile dall’esterno, questo garantirà maggior robustezza al mio codice. Dentro a $menu vi è il menù di navigazione comune a tutte le pagine.
b. ogni pagina è un metodo con:
– un percorso @Route
– un nome del metodo chiaro che ci aiuta a identificare il suo compito.
Ogni metodo deve avere il suffisso Action()
– invio al template ‘index.html.twig’ di un array di variabili
Notare che ‘$this->menu’ è la sintassi corretta per recuperare la proprietà all’interno della funzione.
2. index.html.twig
– estende ‘base.html.twig’
– riceve le variabili come plain text {{pagetitle}}
– riceve le variabili come HTML {{navigationmenu | raw }}, notare che il dato è raw