Как начать работу с Silex в Ubuntu 14.04

Вступление

Silex - это микро-фреймворк PHP, построенный на компонентах Symfony2. Его можно использовать как для создания небольших веб-сайтов, так и для больших приложений. Это сжато, расширяемо и тестируемо.

В этом уроке мы начнем с загрузки и настройки Silex. Затем вы узнаете, как сделать простое приложение Silex.

Мы будем использовать Composer для установки Silex, который является популярным менеджером пакетов PHP. Более подробную информацию о Composer можно найти вthis tutorial. В конце этого урока у вас будет полнофункциональный блог-сайт.

Note: Это руководство было протестировано на Ubuntu, но должно работать одинаково хорошо и в других дистрибутивах Linux. Ссылки относятся к учебным пособиям по Ubuntu, но вы можете найти соответствующие руководства по настройке вашего сервера и установке стека LAMP и Git.

Предпосылки

Пожалуйста, заполните эти условия.

[[шаг-1 -—- установка-сайлекс]] == Шаг 1. Установка Silex

В этом разделе мы установим Silex с помощью Composer. Для начала измените свой рабочий каталог на корень документа Apache,/var/www/html:

cd /var/www/html

Затем удалите содержимое этой папки по умолчанию:

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

Затем перейдите в каталог/var/www, чтобы не раскрывать все свои файлы публике:

cd /var/www

Затем загрузите Composer:

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

Далее мы создадим и отредактируем файл Composercomposer.json:

sudo nano composer.json

В этот файл добавьте следующее содержимое:

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

Теперь мы сказали Composer загрузить Silex версии 1.2 в качестве зависимости. Чтобы начать загрузку, выполните следующую команду:

sudo php composer.phar update

Теперь Composer загрузит Silex и его зависимости; это может занять несколько секунд.

[[step-2 -—- bootstrapping-sealx]] == Шаг 2 - Начальная загрузка Silex

В этом разделе мы загрузим Silex, включив необходимые файлы и создав приложение. Для начала отредактируем файл/var/www/html/index.php:

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

В этом файле добавьте следующее основное содержимое:

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

В этом руководстве мы добавим больше информации о конфигурации и других данных в этот файл. Все новые строки, которые мы добавляем, будут помещаться вSection A, между строками$app = new Silex\Application(); и$app->run();.

В том же файле/var/www/html/index.php включает отладку, что полезно при разработке вашего приложения. Добавьте эту строку вSection A:

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

Шаг 3 - Создание блогового приложения

В этом разделе мы создадим пример блогового приложения. Если вместо этого вы хотите сосредоточиться на собственном приложении, взгляните наSilex documentation.

Мы создадим пример блогового приложения. Он не будет использовать базу данных, но его можно относительно легко преобразовать, взглянув наDoctrineServiceProvider documentation.

Добавление шаблона Twig Engine

Сначала начните с добавления другой зависимости:Twig. Twig - это движок шаблонов, также используемый фреймворком Symfony. Он будет обслуживать шаблоны нашего приложения. Чтобы добавить его, отредактируйтеcomposer.json:

sudo nano /var/www/composer.json

Затем добавьте новую строку зависимости дляtwig, показанную ниже красным. Не забудьте запятую в предыдущей строке:

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

Затем обновите зависимости Composer:

sudo php composer.phar update

Включение mod_rewrite

Теперь вам нужно настроить веб-сервер, в данном случае Apache.

Во-первых, убедитесь, что вы включилиmod_rewrite и разрешили изменения в файле.htaccess. Процесс описан вthis tutorial, но помните, что виртуальный хост Ubuntu 14.04 по умолчанию находится в/var/www/html, а не в/var/www.

После того, как вы включили модуль (как описано в связанном руководстве), добавьте следующие строки в ваш файл/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

Затем создайте и отредактируйте файл.htaccess:

sudo nano /var/www/html/.htaccess

В этот файл добавьте следующее содержимое:


    Options -MultiViews

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

Это гарантирует, что любой запрос на файл, который не существует, указывает на наше приложение, что позволяет приложению выполнять маршрутизацию.

Создание контента блога

Чтобы добавить несколько статей, мы создадим массив, содержащий название, содержание, автора и дату публикации. Мы можем сохранить это в нашем объекте приложения с помощью объекта контейнера, который он расширяет. Контейнерный объект может содержать несколько объектов, которые могут повторно использоваться всеми другими объектами в приложении. Для этого добавьте следующее вSection A в/var/www/html/index.php

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

Добавьте следующее содержание:

$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',
    ),
);

Эти статьи теперь можно повторно использовать везде в нашем приложении, и вы даже можете добавить больше сами. Для реальных веб-сайтов, вероятно, было бы лучше использовать базу данных.

маршрутизация

По сути, маршрутизация сопоставляет URL типаhttp://www.example.com/ с/ и выполняет связанную с ним функцию. Чтобы добавить базовый маршрут, добавьте следующее вSection A из/var/www/html/index.php:

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

Содержание:

$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 });

Теперь, когда вы посещаетеhttp://your_server_ip, он должен отображать список заголовков статей:

The browser view of the page created above

Шаблоны

Несмотря на то, что наш веб-сайт теперь отображает правильную информацию, он выглядит не очень хорошо. Чтобы исправить это, мы будем использовать Twig.

Во-первых, Silex требует, чтобы мы зарегистрировали Twig какservice provider, что в основном является способом повторного использования определенных частей приложения в другом приложении. Чтобы зарегистрировать Twig, добавьте это вsection A:

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

Содержание:

$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
));

Теперь мы можем использовать шаблонизатор Twig. Для этого отредактируйте блок$app->get('/', function (Silex\Application $app) { });, который определяет маршрут/, в соответствии с тем, что показано здесь. Новые строки отображаются вred:

$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
        )
    );
});

Сохраните ваши изменения и закройте файл.

Теперь давайте создадим шаблонindex.html.twig. Создайте каталог, а затем создайте и откройте файлbase.html.twig:

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

Этот файл будет нашим базовым шаблоном, что означает, что все остальные шаблоны будут наследоваться от него, поэтому нам не нужно добавлять основы в каждый шаблон. В этот файл добавьте следующее содержимое:




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


{% block body %}

{% endblock body %}

Этот файл содержит дваblocks. Блоки могут быть переопределены в подшаблонах для предоставления содержимого. Блок с именемtitle будет использоваться для предоставления заголовка для отдельной страницы статьи. Блокbody будет использоваться для отображения всего содержимого.

Сохраните ваши изменения.

Теперь создадим и отредактируем файл/var/www/templates/index.html.twig:

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

Добавьте следующее содержание:

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

Blog index

{% for article in articles %}

{{ article.title }}

{{ article.contents }}

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

{% endfor %} {% endblock %}

Сначала мы указываем, что хотим расширить шаблонbase.html.twig. После этого мы можем начать переопределять блоки, определенные в родительском шаблоне. В этом шаблоне мы переопределяем только блокbody, в котором мы создаем цикл, отображающий все статьи.

Теперь посетитеhttp://your_server_ip; он должен показать индекс всех ваших сообщений:

Browser view of the new index page

Еще один контроллер для одного поста

Далее мы добавим еще один контроллер, который отображает один пост. Сообщения будут сопоставлены по индексу массива. Снова откройте/var/www/html/index.php:

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

Добавьте это вSection A, что позволит нам отображать страницы для отдельных статей:

$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'

Сохраните ваши изменения. Затем создайте и отредактируйте файл/var/www/templates/single.html.twig:

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

Добавьте следующее содержание:

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

{{ article.title }}

{{ article.contents }}

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

{% endblock %}

В этом шаблоне мы также используем блокtitle для отображения заголовка статьи. Блокbody выглядит почти идентично бывшему блокуbody, поэтому он должен быть довольно понятным.

Если вы сейчас посетитеhttp://your_server_ip/0 илиhttp://your_server_ip/1, он должен показать статью:

The browser view of a single article

Однако если вы посетите несуществующий идентификатор, такой какhttp://your_server_ip/2 в этом примере, он отобразит страницу с ошибкой:

The browser view of a non-existing article error

Генерация маршрутов

Далее мы добавим ссылки с домашней страницы в отдельный вид статьи и обратно со статей на домашнюю страницу. Silex имеет возможность генерировать маршруты с использованием компонента Symfony. Он предоставляется какservice provider, поэтому вы должны сначала добавить его вSection A. Открыть/var/www/html/index.php:

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

Добавьте вSection A следующее:

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

Это позволит нам использовать сервис генератора URL. Когда мы создали единственный контроллер представления, мы уже добавили именованный маршрут. Это было сделано с использованием следующей строки:

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

Теперь нам также необходимо привязать маршрут к домашней странице. Для этого добавьте маршрут->bind('index') в конец этого блока, непосредственно перед последней точкой с запятой. Изменения отмечены вred:

$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');

Далее нам нужно будет сгенерировать URL-адреса. Открыть/var/www/templates/index.html.twig:

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

Затем измените следующую строку<h1>, как показано ниже:

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

Blog index

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

Это создает ссылку из заголовка статьи на страницу отдельной статьи. app.url_generator относится к сервису, который мы зарегистрировали. Функцияgenerate принимает два параметра: имя маршрута, в данном случаеsingle, и параметры маршрута, которые в данном случае являются просто идентификатором. loop.index0 относится к 0-индексированному индексу в цикле. Таким образом, когда первый элемент зациклен, это0; когда второй элемент зациклен, это1 и т. д.

То же самое можно сделать, чтобы вернуться к странице индекса в шаблоне одной страницы:

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

Добавьте следующую строку<p> для создания ссылки:

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

Это должно быть довольно очевидно.

Это оно! Не стесняйтесь посетить веб-сайт снова вhttp://your_server_ip/. Вы должны иметь возможность щелкнуть заголовок статьи, чтобы перейти на страницу этой статьи, а затем использовать ссылку в нижней части статьи, чтобы вернуться на домашнюю страницу.

Полный файл index.php

Для справки, вот как должен выглядеть окончательный файл/var/www/html/index.php.

 '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
?>

Заключение

Вы создали простое приложение для блога, используя Silex. Он может быть расширен гораздо дальше, начиная с соединения его с базой данных. Это выходит за рамки этого урока, хотя. The official documentation может быть очень полезным, и его обязательно нужно прочитать, если вы хотите и дальше использовать Silex.

Если Silex слишком мал для вас, вам обязательно стоит подумать об использовании фреймворка Symfony, для которого можно найти руководствоhere.

Related