H2 - P2019

Développement web

Cours 39 - 2016-06-06

Silex

Bonus en vrac

Middlewares

Silex permet d'éxécuter du code avant ou après la fonction de la route appelée

On les appelle middlewares


$app->before(function() use ($app)
{
    // Code exécuté avant la route
});

$app->after(function() use ($app)
{
    // Code exécuté après la route
});

$app->finish(function() use ($app)
{
    // Code exécuté après que la page ait été renvoyée au visiteur
});
                    

Il est possible d'associer des middleswares uniquement à certaines routes


$before = function() use ($app)
{
    // ...
};

$app->get('/', function()
{
    // ...
})
->before($before);
                    

Globales Twig

  • Silex permet de rajouter des variables globales à Twig
  • Ces variables seront utilisables dans n'importe quelle vue
  • On utilise souvent cette feature dans un before
  • Les variables de vue du controller écraseront ces variables


$app->before() use ($app) {
    $app['twig']->addGlobal('title','Hetic Pokedex');
});

                    

<body>
<head>
    <title>{{title}}</title>
</head>

                    

Configuration

  • Lors du développement, un site existe en général dans 3 environnement (parfois plus) : local / preprod / prod
  • Cela devient problématique lorsqu'on à des variables qui dépendent de l'environnement (BDD, chemins, debug, ...)
  • Si on écrase le fichier, on perd la config
  • Voici une façon simple de gérer cela
  • Au même cas que $_POST, $_GET, $_SESSION, etc. PHP fourni un tableau $_SERVER contenant plusieurs informations sur le serveur et l'éxecution
    
    echo '
    ';
    print_r($_SERVER);
    echo '
    '; exit;
  • L'information qui nous intéresse est HTTP_HOST et contient le nom de domaine
  • Nous allons utiliser cette information dans un switch ... case pour définir un tableau de configuration que nous allons stocker dans $app pour pouvoir la réutiliser n'importe où
Dans index.php

// ...

// Config
$config = array();
switch($_SERVER['HTTP_HOST'])
{
    case 'localhost':
        $config['debug']   = true;
        $config['db_host'] = 'localhost';
        $config['db_name'] = 'hetic-p2018-blog-G1';
        $config['db_user'] = 'root';
        $config['db_pass'] = 'root';
        break;
    case 'preprod.monsite.com':
        $config['debug']   = true;
        $config['db_host'] = '';
        $config['db_name'] = '';
        $config['db_user'] = '';
        $config['db_pass'] = '';
        break;
    case 'monsite.com':
        $config['debug']   = false;
        $config['db_host'] = '';
        $config['db_name'] = '';
        $config['db_user'] = '';
        $config['db_pass'] = '';
        break;
}

// App
$app = new Silex\Application();
$app['config'] = $config;
$app['debug']  = $app['config']['debug'];

// ...
                    
Dans index.php

// ...

$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
    'db.options' => array (
        'driver'    => 'pdo_mysql',
        'host'      => $app['config']['db_host'],
        'dbname'    => $app['config']['db_name'],
        'user'      => $app['config']['db_user'],
        'password'  => $app['config']['db_pass'],
        'charset'   => 'utf8'
    ),
));

// ...
                    

Page d'erreur

  • Il est possible de remplacer la page d'erreur de Silex par une vraie page d'erreur avec $app->error()
  • Cette variable fonctionne comme une route créée avec $app->get()
  • Documentation

Dans index.php



// Error
$app->error(function (\Exception $e, $code) use ($app)
{
    $data = array(
        'title' => 'Error'
    );

    return $app['twig']->render('pages/error.twig',$data);
});

                    

Dans une nouvelle vue views/pages/error.twig



{{include('partials/header.twig')}}

Page not found

{{include('partials/footer.twig')}}

                    
  • En développement, on aimerait garder l'affichage des erreurs Silex
  • Pour cela, il suffit de tester la valeur de $app['debug'] et de faire un return si elle est true


// Error
$app->error(function (\Exception $e, $code) use ($app)
{
    if($app['debug'])
        return;

    $data = array(
        'title' => 'Error'
    );

    return $app['twig']->render('error.twig',$data);
});

                    

Requêtes SQL

  • Nous avons vu en cours la bonne façons de traiter les données en passant par des modèles
  • Si vous n'êtes pas à l'aise avec les modèles, vous pouvez faire les requêtes directement dans les routes
  • C'est un peu plus bordélique, mais ça fonctionne

Dans la route home



$app->get('/', function() use ($app,$articles_model) {

    $query    = $app['db']->query('SELECT * FROM articles');
    $articles = $query->fetchAll();

    $data = array(
        'title'    => 'Home',
        'articles' => $articles
    );

    return $app['twig']->render('page.twig',$data);
})
->bind('home');

                    

Redirection

  • Pour rediriger le visiteur, plutôt que d'utiliser header('Location:...') il suffit de faire un return de $app->redirect()
  • Pour créer le chemin vers la route, il suffit d'utiliser $app['url_generator']->generate()


$app->get('/test', function() use ($app)
{
    $url = $app['url_generator']->generate('pokemon',array('id'=>88));
    return $app->redirect($url);
});
                    

Bootstrap Silex

  • Mettre en place un bootstrap n'est pas toujours facile et on a rapidement des problèmes de structure
  • Il existe des versions "toutes faites" permettant de gagner du temps
  • Étudiez-les / modifiez-les / utilisez-les comme bon vous semble