如何开始使用的Silex在Ubuntu 14.04开始

Silex的是建立在Symfony2的组件的PHP微架构。它可以用来建立小网站和大型应用程序的一致好评。它简洁,可扩展和可测试性。 在本教程中,我们将通过下载和配置Silex的开始。然后,你将学会如何做一个基本的Silex的博客应用程序。

介绍

Silex是一个基于Symfony2组件构建的PHP微框架。 它可以用于构建小型网站和大型应用程序。 它简洁,可扩展和可测试。

在本教程中,我们将从下载和配置Silex开始。 然后你将学习如何做一个基本的Silex应用程序。

我们将使用Composer来安装Silex,这是一个流行的PHP包管理器。 有关Composer的更多信息可参见本教程 在本教程结束时,您将拥有一个功能完整的博客站点。

注:本教程在Ubuntu测试,但应工作同样适用于其它Linux发行版。 链接参考Ubuntu教程,但请随时找到适当的指南设置您的服务器和安装LAMP和Git。

先决条件

请完成这些先决条件。

第1步 - 安装Silex

在本节中,我们将使用Composer安装Silex。 首先,改变你的工作目录到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

下一步,我们将创建和编辑Composer文件composer.json

sudo nano composer.json

在此文件中,添加以下内容:

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

我们现在告诉Composer下载Silex版本1.2作为依赖。 要开始下载,请执行以下命令:

sudo php composer.phar update

现在,Composer将下载Silex及其依赖项; 这可能需要几秒钟。

第2步 - 引导Silex

在本节中,我们将通过包括所需的文件和创建应用程序来引导Silex。 要启动,编辑文件/var/www/html/index.php

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

在此文件中,添加以下基本内容:

<?php
require_once __DIR__.'/../vendor/autoload.php'; // Add the autoloading mechanism of Composer

$app = new Silex\Application(); // Create the Silex application, in which all configuration is going to go

// Section A
// We will later add the configuration, etc. here


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

在本教程中,我们将向此文件添加更多配置信息和其他数据。 所有这一切,我们将增加在走新线Section A ,之间$app = new Silex\Application();$app->run();行。

在同一个文件, /var/www/html/index.php打开调试,开发应用程序时,这是很有用的。 加入A节这一行:


$app['debug'] = true;

第3步 - 创建博客应用程序

在本节中,我们将创建一个示例博客应用程序。 如果你要专注于自己的应用程序,而不是,请看看在Silex的文档

我们将创建一个博客应用程序示例。 它不会使使用的数据库的,但它可以通过查看在相对很容易地转换DoctrineServiceProvider文档

添加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

现在,您将需要配置Web服务器,在这种情况下是Apache。

首先,确保你已经启用mod_rewrite并且已获准在变化.htaccess文件。 该过程中所述本教程中 ,但要记住,Ubuntu的14.04的默认虚拟主机是/var/www/html ,而不是/var/www

您启用模块后(如链接的教程中介绍),下面的行添加到您的/etc/apache2/sites-available/000-default.conf文件:

sudo vim /etc/apache2/sites-available/000-default.conf
<Directory /var/www/html/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
</Directory>

然后,创建和编辑.htaccess文件:

sudo nano /var/www/html/.htaccess

在此文件中,添加以下内容:

<IfModule mod_rewrite.c>
    Options -MultiViews

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

这将确保对不存在的文件的任何请求指向我们的应用程序,这允许应用程序进行路由。

创建博客内容

要添加一些文章,我们将创建一个包含标题,内容,作者和出版日期的数组。 我们可以通过它扩展的容器对象将它存储在我们的应用程序对象中。 容器对象能够保存多个对象,这些对象可以由应用程序中的所有其他对象重用。 要做到这一点,添加以下的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 .= '<br />';
    }

    return $output; // Return it to so it gets displayed by the browser
});

现在,当您访问http:// your_server_ip ,它应该显示文章标题的列表:

上面创建的页面的浏览器视图,显示了两篇文章标题

模板

即使我们的网站现在显示正确的输出,它看起来不是很好。 为了解决这个问题,我们将使用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) { });块,它定义的路由/ ,匹配什么的在这里显示。 新的生产线以红色显示:

$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

这个文件将是我们的基本模板,这意味着所有其他模板将继承它,所以我们不必在每个模板中添加基础。 在此文件中,添加以下内容:

<!doctype html>
<html>
<head>
    <title>{% block title %}Blog{% endblock %}</title>
</head>
<body>
{% block body %}

{% endblock body %}
</body>
</html>

此文件包含两个街区 可以在子模板中覆盖块以提供内容。 称为块title将被用来提供用于单个文章网页的标题。 body将被用于显示所有内容。

保存更改。

现在,我们将创建和编辑文件/var/www/templates/index.html.twig

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

添加以下内容:

{% extends 'base.html.twig' %}
{% block body %}
    <h1>
        Blog index
    </h1>

    {% for article in articles %}
        <article>
            <h1>{{ article.title }}</h1>
            <p>{{ article.contents }}</p>
            <p><small>On {{ article.date }} by {{ article.author }}</small></p>
        </article>
    {% endfor %}
{% endblock %}

首先,我们指定我们希望扩展模板base.html.twig 之后,我们可以开始覆盖父模板中定义的块。 在这个模板中,我们只覆盖块body ,在这里我们创建一个循环显示的所有文章。

现在访问http:// your_server_ip ; 它应该显示您的所有帖子的索引:

新的索引页面的浏览器视图,列出所有帖子

单个柱的另一个控制器

接下来,我们将添加另一个控制器,显示单个帖子。 这些帖子将通过它们的数组索引来匹配。 打开/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 %}
    <h1>
        {{ article.title }}
    </h1>
    <p>{{ article.contents }}</p>
    <p><small>On {{ article.date }} by {{ article.author }}</small></p>
{% endblock %}

在这个模板中,我们也利用的title块显示文章标题。 body块看起来几乎相同的前body块,所以它应该是相当不言自明。

如果你现在访问http:// your_server_ip /0http:// your_server_ip /1 ,它应该显示的文章:

单个文章的浏览器视图

但是,如果你访问一个不存在的ID,例如http:// your_server_ip /2在这个例子中,将显示一个错误页:

浏览器查看一个不存在的文章错误,HttpException

生成路由

接下来,我们将添加从主页到单个文章视图的链接,并从文章返回主页。 Silex有能力使用Symfony组件生成路由。 它是作为一个服务提供商 ,所以你应该补充的是先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')在该块的最后路线,只是最后的分号之前。 更改标记为红色

$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 %}
    <h1>
        Blog index
    </h1>

    {% for article in articles %}
        <article>
            <h1><a href="{{ app.url_generator.generate('single', { id: loop.index0 }) }}">{{ article.title }}</a></h1>
            <p>{{ article.contents }}</p>
            <p><small>On {{ article.date }} by {{ article.author }}</small></p>
        </article>
    {% endfor %}
{% endblock %}

这将创建从文章的标题到个别文章页面的链接。 app.url_generator指的是我们已经注册的服务。 generate函数有两个参数:路线名称, single 。在这种情况下,和参数的路由,这仅仅是在这种情况下,该ID 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 %}
    <h1>
        {{ article.title }}
    </h1>
    <p>{{ article.contents }}</p>
    <p><small>On {{ article.date }} by {{ article.author }}</small></p>

    <p><a href="{{ app.url_generator.generate('index') }}">Back to homepage</a></p>
{% endblock %}

这应该是很自明的。

而已! 随意在再次访问该网站http:// your_server_ip / 您应该能够点击文章标题访问该文章的页面,然后使用文章底部的链接返回主页。

完成index.php文件

供您参考,这里的最后一个什么/var/www/html/index.php文件应该是这样。

<?php
require_once __DIR__.'/../vendor/autoload.php'; // Add the autoloading mechanism of Composer

$app = new Silex\Application(); // Create the Silex application, in which all configuration is going to go



// Section A
// We will later add the configuration, etc. here

$app['debug'] = true;
$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',
    ),
);

$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创建了一个简单的博客应用程序。 它可以进一步扩展,从将其与数据库耦合。 这超出了本教程的范围,虽然, 官方文档可以是非常有益的,绝对是一个不可不看的,如果你想继续使用Silex的。

如果Silex的是对你来说太微观,你一定要考虑使用Symfony框架,为此教程可以找到这里