Einführung
Silex ist ein PHP-Mikro-Framework, das auf Symfony2-Komponenten basiert. Es kann verwendet werden, um kleine Websites und große Anwendungen gleichermaßen zu erstellen. Es ist übersichtlich, erweiterbar und überprüfbar.
In diesem Tutorial beginnen wir mit dem Herunterladen und Konfigurieren von Silex. Anschließend lernen Sie, wie Sie eine grundlegende Silex-Anwendung erstellen.
Wir werden Composer verwenden, um Silex zu installieren, einen beliebten PHP-Paketmanager. Weitere Informationen zu Composer finden Sie inthis tutorial. Am Ende dieses Tutorials finden Sie eine voll funktionsfähige Blog-Site.
Note: Dieses Tutorial wurde unter Ubuntu getestet, sollte aber unter anderen Linux-Distributionen genauso gut funktionieren. Die Links verweisen auf Ubuntu-Tutorials. Sie können jedoch auch die entsprechenden Anleitungen zum Einrichten Ihres Servers und zum Installieren des LAMP-Stacks und von Git finden.
Voraussetzungen
Bitte füllen Sie diese Voraussetzungen aus.
-
Arbeitender Ubuntu 14.04 Server mit SSH Zugang. Weitere Informationen finden Sie unterthis tutorial
[[Schritt-1 -—- Installation von Silex]] == Schritt 1 - Installation von Silex
In diesem Abschnitt installieren wir Silex mit Composer. Ändern Sie zunächst Ihr Arbeitsverzeichnis in das Apache-Dokumentstammverzeichnis/var/www/html
:
cd /var/www/html
Löschen Sie als Nächstes den Standardinhalt dieses Ordners:
sudo rm /var/www/html/index.html
Wechseln Sie dann in das Verzeichnis/var/www
, um nicht alle Ihre Dateien der Öffentlichkeit zugänglich zu machen:
cd /var/www
Laden Sie dann Composer herunter:
sudo curl -sS https://getcomposer.org/installer | sudo php
Als nächstes erstellen und bearbeiten wir die Composer-Dateicomposer.json
:
sudo nano composer.json
Fügen Sie dieser Datei den folgenden Inhalt hinzu:
{
"require": {
"silex/silex": "~1.2"
}
}
Wir haben Composer nun angewiesen, Silex Version 1.2 als Abhängigkeit herunterzuladen. Führen Sie den folgenden Befehl aus, um den Download zu starten:
sudo php composer.phar update
Jetzt lädt Composer Silex und seine Abhängigkeiten herunter. Dies kann einige Sekunden dauern.
[[Schritt-2 - Bootstrapping-Silex]] == Schritt 2 - Bootstrapping von Silex
In diesem Abschnitt werden wir Silex booten, indem wir die erforderlichen Dateien einbinden und die Anwendung erstellen. Bearbeiten Sie zunächst die Datei/var/www/html/index.php
:
sudo nano /var/www/html/index.php
Fügen Sie dieser Datei die folgenden grundlegenden Inhalte hinzu:
run(); // Start the application, i.e. handle the request
?>
In diesem Lernprogramm werden dieser Datei weitere Konfigurationsinformationen und andere Daten hinzugefügt. Alle neuen Zeilen, die wir hinzufügen, werden inSection A
zwischen den Zeilen$app = new Silex\Application();
und$app->run();
angezeigt.
In derselben Datei aktiviert/var/www/html/index.php
das Debuggen, was bei der Entwicklung Ihrer Anwendung hilfreich ist. Fügen Sie diese Zeile inSection A hinzu:
+ $app['debug'] = true;+
Schritt 3 - Erstellen einer Bloganwendung
In diesem Abschnitt erstellen wir eine Beispiel-Blog-Anwendung. Wenn Sie sich stattdessen auf Ihre eigene Anwendung konzentrieren möchten, schauen Sie sich bitte dieSilex documentationan.
Wir werden eine Beispiel-Blog-Anwendung erstellen. Es wird keine Datenbank verwendet, aber es kann relativ einfach konvertiert werden, indem man sich dieDoctrineServiceProvider documentation ansieht.
Hinzufügen der Twig Template Engine
Fügen Sie zunächst eine weitere Abhängigkeit hinzu:Twig. Twig ist eine Vorlagen-Engine, die auch vom Symfony-Framework verwendet wird. Es wird die Vorlagen unserer Anwendung dienen. Um es hinzuzufügen, bearbeiten Siecomposer.json
:
sudo nano /var/www/composer.json
Fügen Sie dann die neue Abhängigkeitslinie fürtwig
hinzu, die unten in Rot angezeigt wird. Vergessen Sie nicht das Komma in der vorherigen Zeile:
{
"require": {
"silex/silex": "~1.2",
"twig/twig": ">=1.8,<2.0-dev"
}
}
Aktualisieren Sie als Nächstes die Composer-Abhängigkeiten:
sudo php composer.phar update
Aktivieren von mod_rewrite
Nun müssen Sie den Webserver konfigurieren, in diesem Fall Apache.
Stellen Sie zunächst sicher, dass Siemod_rewrite
aktiviert und Änderungen in der Datei.htaccess
zugelassen haben. Der Prozess wird inthis tutorial beschrieben. Beachten Sie jedoch, dass der virtuelle Standardhost von Ubuntu 14.04 in/var/www/html
und nicht in/var/www
angegeben ist.
Nachdem Sie das Modul aktiviert haben (wie im verknüpften Lernprogramm erläutert), fügen Sie der/etc/apache2/sites-available/000-default.conf
-Datei die folgenden Zeilen hinzu:
sudo vim /etc/apache2/sites-available/000-default.conf
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Erstellen und bearbeiten Sie dann die Datei.htaccess
:
sudo nano /var/www/html/.htaccess
Fügen Sie dieser Datei den folgenden Inhalt hinzu:
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
Dadurch wird sichergestellt, dass jede Anforderung für eine Datei, die nicht vorhanden ist, auf unsere Anwendung verweist, sodass die Anwendung das Routing durchführen kann.
Erstellen von Blog-Inhalten
Um einige Artikel hinzuzufügen, erstellen wir ein Array mit Titel, Inhalt, Autor und Veröffentlichungsdatum. Wir können dies in unserem Anwendungsobjekt mit Hilfe des Containerobjekts speichern, das es erweitert. Ein Containerobjekt kann mehrere Objekte enthalten, die von allen anderen Objekten in der Anwendung wiederverwendet werden können. Fügen Sie dazu Folgendes inSection A
in/var/www/html/index.php
hinzu
sudo nano /var/www/html/index.php
Fügen Sie den folgenden Inhalt hinzu:
$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',
),
);
Diese Artikel können jetzt überall in unserer Anwendung wiederverwendet werden, und Sie können sogar selbst mehr hinzufügen. Für reale Websites wäre es wahrscheinlich besser, eine Datenbank zu verwenden.
Routing
Grundsätzlich ordnet das Routing eine URL wiehttp://www.example.com/
/ zu und führt die damit verbundene Funktion aus. Fügen Sie zum Hinzufügen einer Basisroute Folgendes inSection A
von/var/www/html/index.php
hinzu:
sudo nano /var/www/html/index.php
Inhalt:
$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
});
Wenn Sie jetzthttp://your_server_ip
besuchen, sollte eine Liste der Artikeltitel angezeigt werden:
Vorlagen
Obwohl unsere Website jetzt die richtige Ausgabe anzeigt, sieht sie nicht besonders gut aus. Um dies zu beheben, werden wir Twig verwenden.
Erstens verlangt Silex, dass wir Twig alsservice provider registrieren. Dies ist im Grunde eine Möglichkeit, bestimmte Teile einer Anwendung in einer anderen Anwendung wiederzuverwenden. Um Twig zu registrieren, fügen Sie dies insection A
hinzu:
sudo nano /var/www/html/index.php
Inhalt:
$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
));
Wir können jetzt die Twig Template Engine nutzen. Bearbeiten Sie dazu den Block$app->get('/', function (Silex\Application $app) { });
, der die Route von/
definiert, so, dass er mit den hier gezeigten übereinstimmt. Neue Zeilen werden inred angezeigt:
$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
)
);
});
Speichern Sie Ihre Änderungen und schließen Sie die Datei.
Jetzt erstellen wir die Vorlageindex.html.twig
. Erstellen Sie das Verzeichnis und erstellen und öffnen Sie die Dateibase.html.twig
:
sudo mkdir /var/www/templates
sudo nano /var/www/templates/base.html.twig
Diese Datei ist unsere Basisvorlage. Das bedeutet, dass alle anderen Vorlagen von ihr geerbt werden, sodass wir nicht bei jeder Vorlage die Grundlagen hinzufügen müssen. Fügen Sie dieser Datei den folgenden Inhalt hinzu:
{% block title %}Blog{% endblock %}
{% block body %}
{% endblock body %}
Diese Datei enthält zweiblocks. Blöcke können in Untervorlagen überschrieben werden, um Inhalt bereitzustellen. Der Blocktitle
wird verwendet, um einen Titel für die einzelne Artikelseite bereitzustellen. Der Blockbody
wird verwendet, um alle Inhalte anzuzeigen.
Speichern Sie Ihre Änderungen.
Jetzt erstellen und bearbeiten wir die Datei/var/www/templates/index.html.twig
:
sudo nano /var/www/templates/index.html.twig
Fügen Sie den folgenden Inhalt hinzu:
{% extends 'base.html.twig' %}
{% block body %}
Blog index
{% for article in articles %}
{{ article.title }}
{{ article.contents }}
On {{ article.date }} by {{ article.author }}
{% endfor %}
{% endblock %}
Zunächst geben wir an, dass wir die Vorlagebase.html.twig
erweitern möchten. Danach können wir die in der übergeordneten Vorlage definierten Blöcke überschreiben. In dieser Vorlage überschreiben wir nur den Blockbody
, in dem wir eine Schleife erstellen, in der alle Artikel angezeigt werden.
Besuchen Sie jetzthttp://your_server_ip
; Es sollte einen Index aller Ihrer Beiträge anzeigen:
Ein weiterer Controller für einen einzelnen Post
Als nächstes werden wir einen weiteren Controller hinzufügen, der einen einzelnen Beitrag anzeigt. Die Beiträge werden anhand ihres Array-Index abgeglichen. Öffnen Sie/var/www/html/index.php
erneut:
sudo nano /var/www/html/index.php
Fügen Sie dies zuSection A
hinzu, damit wir Seiten für einzelne Artikel anzeigen können:
$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'
Speichern Sie Ihre Änderungen. Erstellen und bearbeiten Sie dann die Datei/var/www/templates/single.html.twig
:
sudo nano /var/www/templates/single.html.twig
Fügen Sie den folgenden Inhalt hinzu:
{% extends 'base.html.twig' %}
{% block title %}{{ article.title }}{% endblock %}
{% block body %}
{{ article.title }}
{{ article.contents }}
On {{ article.date }} by {{ article.author }}
{% endblock %}
In dieser Vorlage verwenden wir auch den Blocktitle
, um den Artikeltitel anzuzeigen. Der Blockbody
ieht fast identisch mit dem früheren Blockbody
aus, daher sollte er ziemlich selbsterklärend sein.
Wenn Sie jetzthttp://your_server_ip/0
oderhttp://your_server_ip/1
besuchen, sollte ein Artikel angezeigt werden:
Wenn Sie jedoch eine nicht vorhandene ID wie in diesem Beispielhttp://your_server_ip/2
besuchen, wird eine Fehlerseite angezeigt:
Routen generieren
Als Nächstes fügen wir Links von der Homepage zur Einzelartikelansicht und zurück von den Artikeln zur Homepage hinzu. Silex kann Routen mit einer Symfony-Komponente generieren. Es wird alsservice provider angegeben, daher sollten Sie dies zuerst zuSection A
hinzufügen. Öffnen Sie/var/www/html/index.php
:
sudo nano /var/www/html/index.php
Fügen SieSection A
Folgendes hinzu:
$app->register(new Silex\Provider\UrlGeneratorServiceProvider());
Dadurch können wir den URL-Generator-Service nutzen. Als wir den Einzelansichts-Controller erstellt haben, haben wir bereits eine benannte Route hinzugefügt. Es wurde mit der folgenden Zeile gemacht:
->bind('single'); // name the route so it can be referred to later in the section 'Generating routes'
Jetzt müssen wir auch eine Route zur Homepage binden. Fügen Sie dazu die Route->bind('index')
am Ende dieses Blocks kurz vor dem letzten Semikolon hinzu. Änderungen sind inred markiert:
$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');
Als nächstes müssen wir die URLs generieren. Öffnen Sie/var/www/templates/index.html.twig
:
sudo nano /var/www/templates/index.html.twig
Ändern Sie dann die folgende Zeile von<h1>
wie unten gezeigt:
{% extends 'base.html.twig' %}
{% block body %}
Blog index
{% for article in articles %}
{{ article.title }}
{{ article.contents }}
On {{ article.date }} by {{ article.author }}
{% endfor %}
{% endblock %}
Dadurch wird ein Link vom Titel des Artikels zur einzelnen Artikelseite erstellt. app.url_generator
bezieht sich auf den Dienst, den wir registriert haben. Die Funktiongenerate
akzeptiert zwei Parameter: den Routennamen, in diesem Fallsingle
, und Parameter für die Route, in diesem Fall nur die ID. loop.index0
bezieht sich auf einen 0-indizierten Index in der Schleife. Wenn also das erste Element geloopt wird, ist es ein0
; Wenn das zweite Element geloopt wird, ist es ein1
usw.
Dasselbe kann getan werden, um auf die Indexseite in der Einzelseitenvorlage zurückzugreifen:
sudo nano /var/www/templates/single.html.twig
Fügen Sie die folgende<p>
-Zeile hinzu, um den Link zu erstellen:
{% extends 'base.html.twig' %}
{% block title %}{{ article.title }}{% endblock %}
{% block body %}
{{ article.title }}
{{ article.contents }}
On {{ article.date }} by {{ article.author }}
{% endblock %}
Dies sollte ziemlich selbsterklärend sein.
Das ist es! Fühlen Sie sich frei, die Website unterhttp://your_server_ip/
erneut zu besuchen. Sie sollten in der Lage sein, auf einen Artikeltitel zu klicken, um die Seite dieses Artikels aufzurufen, und dann den Link am Ende des Artikels zu verwenden, um zur Startseite zurückzukehren.
Komplette index.php Datei
Als Referenz sehen Sie hier, wie die endgültige/var/www/html/index.php
-Datei aussehen sollte.
'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
?>
Fazit
Sie haben mit Silex eine einfache Blog-Anwendung erstellt. Es kann viel weiter ausgebaut werden, beginnend mit der Kopplung mit einer Datenbank. Dies liegt jedoch außerhalb des Rahmens dieses Lernprogramms. The official documentation kann sehr hilfreich sein und ist definitiv ein Muss, wenn Sie Silex weiterhin verwenden möchten.
Wenn Silex für Sie zu klein ist, sollten Sie auf jeden Fall das Symfony-Framework verwenden, für das ein Tutorialhere gefunden werden kann.