Comment démarrer avec Silex sur Ubuntu 14.04

introduction

Silex est un micro-framework PHP construit sur des composants Symfony2. Il peut être utilisé pour créer de petits sites Web et de grandes applications. Il est concis, extensible et testable.

Dans ce tutoriel, nous allons commencer par télécharger et configurer Silex. Ensuite, vous apprendrez à créer une application Silex de base.

Nous utiliserons Composer pour installer Silex, un gestionnaire de paquets PHP populaire. Vous trouverez plus d'informations sur Composer dansthis tutorial. À la fin de ce didacticiel, vous aurez un site de blog entièrement fonctionnel.

Note: Ce tutoriel a été testé sur Ubuntu, mais devrait fonctionner aussi bien sur d'autres distributions Linux. Les liens renvoient aux didacticiels Ubuntu, mais n'hésitez pas à trouver les guides appropriés pour configurer votre serveur et installer la pile LAMP et Git.

Conditions préalables

S'il vous plaît remplir ces conditions préalables.

[[step-1 -—- Installing-silex]] == Étape 1 - Installation de Silex

Dans cette section, nous allons installer Silex à l’aide de Composer. Pour commencer, remplacez votre répertoire de travail par la racine du document Apache,/var/www/html:

cd /var/www/html

Ensuite, supprimez le contenu par défaut de ce dossier:

sudo rm /var/www/html/index.html

Ensuite, placez-vous dans le répertoire/var/www pour ne pas exposer tous vos fichiers au public:

cd /var/www

Ensuite, téléchargez Composer:

sudo curl -sS https://getcomposer.org/installer | sudo php

Ensuite, nous allons créer et éditer le fichier Composercomposer.json:

sudo nano composer.json

Dans ce fichier, ajoutez le contenu suivant:

{
    "require": {
        "silex/silex": "~1.2"
    }
}

Nous avons maintenant demandé à Composer de télécharger la version 1.2 de Silex en tant que dépendance. Pour démarrer le téléchargement, exécutez la commande suivante:

sudo php composer.phar update

Composer va maintenant télécharger Silex et ses dépendances. cela peut prendre quelques secondes.

[[step-2 -—- bootstrapping-silex]] == Étape 2 - Bootstrapping Silex

Dans cette section, nous allons amorcer Silex en incluant les fichiers requis et en créant l’application. Pour commencer, éditez le fichier/var/www/html/index.php:

sudo nano /var/www/html/index.php

Dans ce fichier, ajoutez le contenu de base suivant:

run(); // Start the application, i.e. handle the request
?>

Tout au long de ce tutoriel, nous ajouterons plus d’informations de configuration et d’autres données à ce fichier. Toutes les nouvelles lignes que nous ajoutons iront enSection A, entre les lignes$app = new Silex\Application(); et$app->run();.

Dans le même fichier,/var/www/html/index.php active le débogage, ce qui est utile lors du développement de votre application. Ajoutez cette ligne dansSection A:

+ $app['debug'] = true;+

Étape 3 - Création d'une application de blog

Dans cette section, nous allons créer un exemple d'application de blog. Si vous souhaitez vous concentrer sur votre propre application à la place, jetez un œil auxSilex documentation.

Nous allons créer un exemple d'application de blog. Il n'utilisera pas de base de données, mais il peut être converti relativement facilement en jetant un œil auxDoctrineServiceProvider documentation.

Ajout du moteur de template Twig

Commencez par ajouter une autre dépendance:Twig. Twig est un moteur de template également utilisé par le framework Symfony. Il servira les modèles de notre application. Pour l'ajouter, éditezcomposer.json:

sudo nano /var/www/composer.json

Ensuite, ajoutez la nouvelle ligne de dépendance pourtwig, indiquée en rouge ci-dessous. Ne pas oublier la virgule sur la ligne précédente:

{
    "require": {
        "silex/silex": "~1.2",
        "twig/twig": ">=1.8,<2.0-dev"
    }
}

Ensuite, mettez à jour les dépendances Composer:

sudo php composer.phar update

Activer mod_rewrite

Maintenant, vous devrez configurer le serveur Web, qui est Apache dans ce cas.

Tout d'abord, assurez-vous que vous avez activémod_rewrite et que vous avez autorisé les modifications dans le fichier.htaccess. Le processus est décrit dansthis tutorial, mais rappelez-vous que l'hôte virtuel par défaut d'Ubuntu 14.04 est en/var/www/html plutôt qu'en/var/www.

Après avoir activé le module (comme expliqué dans le didacticiel lié), ajoutez les lignes suivantes à votre fichier/etc/apache2/sites-available/000-default.conf:

sudo vim /etc/apache2/sites-available/000-default.conf

                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all

Ensuite, créez et éditez le fichier.htaccess:

sudo nano /var/www/html/.htaccess

Dans ce fichier, ajoutez le contenu suivant:


    Options -MultiViews

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]

Cela garantira que toute demande de fichier qui n'existe pas pointe vers notre application, ce qui permet à l'application de faire le routage.

Création de contenu de blog

Pour ajouter des articles, nous allons créer un tableau contenant le titre, le contenu, l'auteur et la date de publication. Nous pouvons stocker cela dans notre objet application à l'aide de l'objet conteneur qu'il étend. Un objet conteneur peut contenir plusieurs objets, qui peuvent être réutilisés par tous les autres objets de l'application. Pour ce faire, ajoutez ce qui suit enSection A en/var/www/html/index.php

sudo nano /var/www/html/index.php

Ajoutez le contenu suivant:

$app['articles'] = array(
    array(
        'title'    => 'Lorem ipsum dolor sit amet',
        'contents' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean mollis vestibulum ultricies. Sed sit amet sagittis nisl. Nulla leo metus, efficitur non risus ut, tempus convallis sem. Mauris pharetra sagittis ligula pharetra accumsan. Cras auctor porta enim, a eleifend enim volutpat vel. Nam volutpat maximus luctus. Phasellus interdum elementum nulla, nec mollis justo imperdiet ac. Duis arcu dolor, ultrices eu libero a, luctus sollicitudin diam. Phasellus finibus dictum turpis, nec tincidunt lacus ullamcorper et. Praesent laoreet odio lacus, nec lobortis est ultrices in. Etiam facilisis elementum lorem ut blandit. Nunc faucibus rutrum nulla quis convallis. Fusce molestie odio eu mauris molestie, a tempus lorem volutpat. Sed eu lacus eu velit tincidunt sodales nec et felis. Nullam velit ex, pharetra non lorem in, fringilla tristique dolor. Mauris vel erat nibh.',
        'author'   => 'Sammy',
        'date'     => '2014-12-18',
    ),
    array(
        'title'    => 'Duis ornare',
        'contents' => 'Duis ornare, odio sit amet euismod vulputate, purus dui fringilla neque, quis eleifend purus felis ut odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque bibendum pretium ante, eu aliquet dolor feugiat et. Pellentesque laoreet est lectus, vitae vulputate libero sollicitudin consequat. Vivamus finibus interdum egestas. Nam sagittis vulputate lacus, non condimentum sapien lobortis a. Sed ligula ante, ultrices ut ullamcorper nec, facilisis ac mi. Nam in vehicula justo. In hac habitasse platea dictumst. Duis accumsan pellentesque turpis, nec eleifend ex suscipit commodo.',
        'author'   => 'Sammy',
        'date'     => '2014-11-08',
    ),
);

Ces articles peuvent maintenant être réutilisés partout dans notre application, et vous pouvez même en ajouter d'autres vous-même. Pour les sites Web réels, il serait probablement préférable d'utiliser une base de données.

Routage

Fondamentalement, le routage mappe une URL commehttp://www.example.com/ à/ et exécute la fonction qui lui est associée. Pour ajouter une route de base, ajoutez ce qui suit dansSection A de/var/www/html/index.php:

sudo nano /var/www/html/index.php

Contenu:

$app->get('/', function (Silex\Application $app)  { // Match the root route (/) and supply the application as argument
    $output = '';
    foreach ($app['articles'] as $article) { // Create a basic list of article titles
        $output .= $article['title'];
        $output .= '
'; } return $output; // Return it to so it gets displayed by the browser });

Maintenant, lorsque vous visitezhttp://your_server_ip, il devrait afficher une liste de titres d'articles:

The browser view of the page created above

Modèles

Même si notre site Web affiche maintenant le bon résultat, il n’est pas très joli. Pour résoudre ce problème, nous allons utiliser Twig.

Premièrement, Silex nous oblige à enregistrer Twig en tant queservice provider, ce qui est essentiellement un moyen de réutiliser certaines parties d'une application dans une autre application. Pour enregistrer Twig, ajoutez ceci danssection A:

sudo nano /var/www/html/index.php

Contenu:

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/../templates', // The path to the templates, which is in our case points to /var/www/templates
));

Nous pouvons maintenant utiliser le moteur de template Twig. Pour ce faire, modifiez le bloc$app->get('/', function (Silex\Application $app) { });, qui définit l'itinéraire de/, pour qu'il corresponde à ce qui est affiché ici. Les nouvelles lignes sont affichées enred:

$app->get('/', function (Silex\Application $app)  { // Match the root route (/) and supply the application as argument
    return $app['twig']->render( // Render the page index.html.twig
        'index.html.twig',
        array(
            'articles' => $app['articles'], // Supply arguments to be used in the template
        )
    );
});

Enregistrez vos modifications et fermez le fichier.

Créons maintenant le modèleindex.html.twig. Créez le répertoire, puis créez et ouvrez le fichierbase.html.twig:

sudo mkdir /var/www/templates
sudo nano /var/www/templates/base.html.twig

Ce fichier constituera notre modèle de base, ce qui signifie que tous les autres modèles en hériteront. Il n’est donc pas nécessaire d’ajouter les bases dans chaque modèle. Dans ce fichier, ajoutez le contenu suivant:




    {% block title %}Blog{% endblock %}


{% block body %}

{% endblock body %}

Ce fichier contient deuxblocks. Les blocs peuvent être remplacés dans les sous-modèles pour fournir du contenu. Le bloc appelétitle sera utilisé pour fournir un titre à la page d'article unique. Le blocbody sera utilisé pour afficher tout le contenu.

Enregistrez vos modifications.

Nous allons maintenant créer et modifier le fichier/var/www/templates/index.html.twig:

sudo nano /var/www/templates/index.html.twig

Ajoutez le contenu suivant:

{% extends 'base.html.twig' %}
{% block body %}
    

Blog index

{% for article in articles %}

{{ article.title }}

{{ article.contents }}

On {{ article.date }} by {{ article.author }}

{% endfor %} {% endblock %}

Tout d'abord, nous spécifions que nous voulons étendre le modèlebase.html.twig. Après cela, nous pouvons commencer à remplacer les blocs définis dans le modèle parent. Dans ce modèle, nous remplaçons uniquement le blocbody, où nous créons une boucle qui affiche tous les articles.

Maintenant, visitezhttp://your_server_ip; il devrait afficher un index de tous vos messages:

Browser view of the new index page

Un autre contrôleur pour un seul poste

Ensuite, nous allons ajouter un autre contrôleur qui affiche un seul post. Les publications seront mises en correspondance par leur index de tableau. Ouvrez à nouveau/var/www/html/index.php:

sudo nano /var/www/html/index.php

Ajoutez ceci àSection A, ce qui nous permettra d'afficher des pages pour des articles individuels:

$app->get('/{id}', function (Silex\Application $app, $id)  { // Add a parameter for an ID in the route, and it will be supplied as argument in the function
    if (!array_key_exists($id, $app['articles'])) {
        $app->abort(404, 'The article could not be found');
    }
    $article = $app['articles'][$id];
    return $app['twig']->render(
        'single.html.twig',
        array(
            'article' => $article,
        )
    );
})
    ->assert('id', '\d+') // specify that the ID should be an integer
    ->bind('single'); // name the route so it can be referred to later in the section 'Generating routes'

Enregistrez vos modifications. Ensuite, créez et éditez le fichier/var/www/templates/single.html.twig:

sudo nano /var/www/templates/single.html.twig

Ajoutez le contenu suivant:

{% extends 'base.html.twig' %}
{% block title %}{{ article.title }}{% endblock %}
{% block body %}
    

{{ article.title }}

{{ article.contents }}

On {{ article.date }} by {{ article.author }}

{% endblock %}

Dans ce modèle, nous utilisons également le bloctitle pour afficher le titre de l'article. Le blocbody semble presque identique à l'ancien blocbody, il devrait donc être assez explicite.

Si vous visitez maintenanthttp://your_server_ip/0 ouhttp://your_server_ip/1, il devrait afficher un article:

The browser view of a single article

Si, cependant, vous visitez un ID inexistant, tel quehttp://your_server_ip/2 dans cet exemple, il affichera une page d'erreur:

The browser view of a non-existing article error

Générer des itinéraires

Ensuite, nous ajouterons des liens de la page d'accueil à la vue d'article unique, puis des articles à la page d'accueil. Silex peut générer des itinéraires à l'aide d'un composant Symfony. Il est fourni sous forme deservice provider, vous devez donc d'abord l'ajouter àSection A. Ouvrir/var/www/html/index.php:

sudo nano /var/www/html/index.php

Ajoutez ce qui suit àSection A:

$app->register(new Silex\Provider\UrlGeneratorServiceProvider());

Cela nous permettra d'utiliser le service de générateur d'URL. Lorsque nous avons créé le contrôleur de vue unique, nous avons déjà ajouté un itinéraire nommé. Cela a été fait en utilisant la ligne suivante:

->bind('single'); // name the route so it can be referred to later in the section 'Generating routes'

Maintenant, nous devrons également lier un itinéraire à la page d'accueil. Pour ce faire, ajoutez la route->bind('index') à la fin de ce bloc, juste avant le point-virgule final. Les changements sont marqués enred:

$app->get('/', function (Silex\Application $app)  { // Match the root route (/) and supply the application as argument
    return $app['twig']->render(
        'index.html.twig',
        array(
            'articles' => $app['articles'],
        )
    );
})->bind('index');

Ensuite, nous aurons besoin de générer les URL. Ouvrir/var/www/templates/index.html.twig:

sudo nano /var/www/templates/index.html.twig

Ensuite, modifiez la ligne<h1> suivante, comme indiqué ci-dessous:

{% extends 'base.html.twig' %}
{% block body %}
    

Blog index

{% for article in articles %} {% endfor %} {% endblock %}

Cela crée un lien entre le titre de l'article et la page de l'article individuel. Leapp.url_generator fait référence au service que nous avons enregistré. La fonctiongenerate prend deux paramètres: le nom de la route,single dans ce cas, et les paramètres de la route, qui est juste l'ID dans ce cas. loop.index0 fait référence à un index indexé 0 dans la boucle. Ainsi, lorsque le premier élément est mis en boucle, il s'agit d'un0; lorsque le deuxième élément est mis en boucle, il s'agit d'un1, etc.

La même chose peut être faite pour faire référence à la page d'index dans le modèle de page unique:

sudo nano /var/www/templates/single.html.twig

Ajoutez la ligne<p> suivante pour créer le lien:

{% extends 'base.html.twig' %}
{% block title %}{{ article.title }}{% endblock %}
{% block body %}
    

{{ article.title }}

{{ article.contents }}

On {{ article.date }} by {{ article.author }}

Back to homepage

{% endblock %}

Cela devrait être assez explicite.

C'est ça! N'hésitez pas à visiter à nouveau le site Web àhttp://your_server_ip/. Vous devriez pouvoir cliquer sur le titre d’un article pour visiter la page de cet article, puis utiliser le lien au bas de l’article pour revenir à la page d’accueil.

Fichier index.php complet

Pour votre information, voici à quoi devrait ressembler le fichier/var/www/html/index.php final.

 'Lorem ipsum dolor sit amet',
        'contents' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean mollis vestibulum ultricies. Sed sit amet sagittis nisl. Nulla leo metus, efficitur non risus ut, tempus convallis sem. Mauris pharetra sagittis ligula pharetra accumsan. Cras auctor porta enim, a eleifend enim volutpat vel. Nam volutpat maximus luctus. Phasellus interdum elementum nulla, nec mollis justo imperdiet ac. Duis arcu dolor, ultrices eu libero a, luctus sollicitudin diam. Phasellus finibus dictum turpis, nec tincidunt lacus ullamcorper et. Praesent laoreet odio lacus, nec lobortis est ultrices in. Etiam facilisis elementum lorem ut blandit. Nunc faucibus rutrum nulla quis convallis. Fusce molestie odio eu mauris molestie, a tempus lorem volutpat. Sed eu lacus eu velit tincidunt sodales nec et felis. Nullam velit ex, pharetra non lorem in, fringilla tristique dolor. Mauris vel erat nibh.',
        'author'   => 'Sammy',
        'date'     => '2014-12-18',
    ),
    array(
        'title'    => 'Duis ornare',
        'contents' => 'Duis ornare, odio sit amet euismod vulputate, purus dui fringilla neque, quis eleifend purus felis ut odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque bibendum pretium ante, eu aliquet dolor feugiat et. Pellentesque laoreet est lectus, vitae vulputate libero sollicitudin consequat. Vivamus finibus interdum egestas. Nam sagittis vulputate lacus, non condimentum sapien lobortis a. Sed ligula ante, ultrices ut ullamcorper nec, facilisis ac mi. Nam in vehicula justo. In hac habitasse platea dictumst. Duis accumsan pellentesque turpis, nec eleifend ex suscipit commodo.',
        'author'   => 'Sammy',
        'date'     => '2014-11-08',
    ),
);

$app->get('/', function (Silex\Application $app)  { // Match the root route (/) and supply the application as argument
    return $app['twig']->render( // Render the page index.html.twig
        'index.html.twig',
        array(
            'articles' => $app['articles'], // Supply arguments to be used in the template
        )
    );
})->bind('index');

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/../templates', // The path to the templates, which is in our case points to /var/www/templates
));

$app->get('/{id}', function (Silex\Application $app, $id)  { // Add a parameter for an ID in the route, and it will be supplied as argument in the function
    if (!array_key_exists($id, $app['articles'])) {
        $app->abort(404, 'The article could not be found');
    }
    $article = $app['articles'][$id];
    return $app['twig']->render(
        'single.html.twig',
        array(
            'article' => $article,
        )
    );
})
    ->assert('id', '\d+') // specify that the ID should be an integer
    ->bind('single'); // name the route so it can be referred to later in the section 'Generating routes'

$app->register(new Silex\Provider\UrlGeneratorServiceProvider());




// This should be the last line
$app->run(); // Start the application, i.e. handle the request
?>

Conclusion

Vous avez créé une application de blog simple à l'aide de Silex. Il peut être beaucoup plus étendu, en commençant par le coupler avec une base de données. Cela sort du cadre de ce tutoriel, cependant. The official documentation peut être très utile et est certainement une lecture incontournable si vous souhaitez continuer à utiliser Silex.

Si Silex est trop micro pour vous, vous devriez certainement envisager d'utiliser le framework Symfony, pour lequel un tutoriel peut être trouvéhere.