Erste Schritte mit Silex unter Ubuntu 14.04

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.

[[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.phpdas 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:

The browser view of the page created above

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:

Browser view of the new index page

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 Blockbodyieht fast identisch mit dem früheren Blockbodyaus, 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:

The browser view of a single article

Wenn Sie jedoch eine nicht vorhandene ID wie in diesem Beispielhttp://your_server_ip/2 besuchen, wird eine Fehlerseite angezeigt:

The browser view of a non-existing article error

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 %} {% 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 }}

Back to homepage

{% 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.