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.
-
Serveur Ubuntu 14.04 en fonctionnement avec accès SSH. Pour plus d'informations, visitezthis tutorial
[[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:
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:
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:
Si, cependant, vous visitez un ID inexistant, tel quehttp://your_server_ip/2
dans cet exemple, il affichera une page d'erreur:
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 %}
{{ article.title }}
{{ article.contents }}
On {{ article.date }} by {{ article.author }}
{% 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 }}
{% 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.