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