前書き

SilexはSymfony2コンポーネント上に構築されたPHPマイクロフレームワークです。 小規模なWebサイトと大規模なアプリケーションを同様に構築するために使用できます。 簡潔で、拡張可能で、テスト可能です。

このチュートリアルでは、Silexをダウンロードして構成することから始めます。 次に、基本的なSilexアプリケーションの作成方法を学びます。

Composerを使用して、人気のPHPパッケージマネージャーであるSilexをインストールします。 Composerの詳細については、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-composer-on-your-vps-running-ubuntu [このチュートリアル]を参照してください。 このチュートリアルの最後に、完全に機能するブログサイトが作成されます。

_
*注意:*このチュートリアルはUbuntuでテストされましたが、他のLinuxディストリビューションでも同様に機能するはずです。 リンクはUbuntuのチュートリアルを参照していますが、サーバーをセットアップし、LAMPスタックとGitをインストールするための適切なガイドを見つけてください。
_

前提条件

これらの前提条件を完了してください。

  • SSHアクセスで動作するUbuntu 14.04サーバー。 詳細については、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 [このチュートリアル]をご覧ください。

  • sudo user

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

このチュートリアル全体を通して、このファイルにさらに構成情報やその他のデータを追加します。 追加するすべての新しい行は、 `+ $ app = new Silex \ Application(); `行と ` $ app→ run(); `行の間の ` Section A +`に入ります。

同じファイル内で、 `+ / var / www / html / index.php +`はデバッグを有効にします。これはアプリケーションの開発時に役立ちます。 *セクションA *に次の行を追加します。

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

ステップ3-ブログアプリケーションの作成

このセクションでは、サンプルのブログアプリケーションを作成します。 代わりに独自のアプリケーションに集中したい場合は、http://silex.sensiolabs.org/doc/usage.html#routing [Silex documentation]をご覧ください。

サンプルのブログアプリケーションを作成します。 データベースは使用しませんが、http://silex.sensiolabs.org/doc/providers/doctrine.html [DoctrineServiceProvider documentation]を見ると比較的簡単に変換できます。

Twigテンプレートエンジンの追加

最初に、別の依存関係を追加することから始めます:http://twig.sensiolabs.org/[Twig]。 Twigは、Symfonyフレームワークでも使用されるテンプレートエンジンです。 アプリケーションのテンプレートを提供します。 追加するには、 `+ composer.json`を編集します:

sudo nano /var/www/composer.json

次に、下に赤で示されている「+ twig +」の新しい依存関係行を追加します。 前の行のコンマを忘れないでください:

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

   }
}

次に、Composerの依存関係を更新します。

sudo php composer.phar update

mod_rewriteを有効にする

次に、Webサーバー(この場合はApache)を構成する必要があります。

最初に、 `+ mod_rewrite `を有効にし、 ` .htaccess `ファイルの変更を許可していることを確認してください。 このプロセスはhttps://www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite [このチュートリアル]で説明されていますが、Ubuntu 14.04のデフォルトの仮想ホストは ` / var / 「+ / var / www +」ではなく、www / html + `。

(リンクされたチュートリアルで説明されているように)モジュールを有効にしたら、次の行を `+ / 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>

これにより、存在しないファイルへの要求がアプリケーションを指すようになり、アプリケーションがルーティングを実行できるようになります。

ブログコンテンツの作成

記事を追加するために、タイトル、コンテンツ、著者、発行日を含む配列を作成します。 これを拡張するコンテナオブジェクトを使用して、アプリケーションオブジェクトに保存できます。 コンテナオブジェクトは複数のオブジェクトを保持でき、アプリケーション内の他のすべてのオブジェクトで再利用できます。 これを行うには、 + / var / www / html / index.php`の + Section A + `に以下を追加します

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

これらの記事は、アプリケーションのどこででも再利用でき、さらに自分で追加することもできます。 実際のWebサイトの場合、データベースを使用することをお勧めします。

ルーティング

基本的に、ルーティングは `+ http:// www.example.com / `のようなURLをそれに関連付けられた機能にマッピングして実行します。 基本的なルートを追加するには、 ` / var / www / html / index.php `の ` Section A +`に以下を追加します。

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:// +`にアクセスすると、記事タイトルのリストが表示されるはずです。

image:https://assets.digitalocean.com/articles/silex_ubuntu/1.png [2つの記事タイトルを表示した、上記で作成されたページのブラウザービュー]

テンプレート

ウェブサイトに正しい出力が表示されるようになりましたが、見た目はあまり良くありません。 これを修正するために、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){}); `ブロックを編集して、 ` / +`のルートを定義し、ここに表示されているものと一致させます。 新しい行は次のとおりです。

$app->get('/', function (Silex\Application $app)  { // Match the root route (/) and supply the application as argument






});

変更を保存してファイルを閉じます。

それでは、 `+ 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>

このファイルには2つの_blocks_が含まれています。 ブロックをサブテンプレートでオーバーライドして、コンテンツを提供できます。 「+ 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:// +」にアクセスします。すべての投稿のインデックスが表示されます:

image:https://assets.digitalocean.com/articles/silex_ubuntu/2.png [すべての投稿を一覧表示する新しいインデックスページのブラウザビュー]

シングルポスト用の別のコントローラー

次に、単一の投稿を表示する別のコントローラーを追加します。 投稿は配列インデックスと照合されます。 `+ / 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:/// 0 `または ` http:/// 1 +`にアクセスすると、記事が表示されます:

image:https://assets.digitalocean.com/articles/silex_ubuntu/3.png [単一の記事のブラウザビュー]

ただし、この例の `+ http:/// 2 +`などの存在しないIDにアクセスすると、エラーページが表示されます。

image:https://assets.digitalocean.com/articles/silex_ubuntu/4.png [存在しない記事エラーのブラウザビュー、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ジェネレーターサービスを利用できるようになります。 単一のView Controllerを作成したときに、名前付きルートをすでに追加しています。 次の行を使用して行われました。

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

次に、実際に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></h1>
           <p>{{ article.contents }}</p>
           <p><small>On {{ article.date }} by {{ article.author }}</small></p>
       </article>
   {% endfor %}
{% endblock %}

これにより、記事のタイトルから個々の記事ページへのリンクが作成されます。 + app.url_generator +`は登録したサービスを指します。 `+ generate +`関数は2つのパラメーターを取ります:ルート名(この場合は `+ single +)と、ルートのパラメーター(この場合は単なるID)。 `+ loop.index0 `は、ループ内の0インデックス付きインデックスを参照します。 したがって、最初の項目がループされるとき、それは ` 0 `です。 2番目の項目がループされるとき、それは「+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>


{% endblock %}

これは一目瞭然です。

それでおしまい! `+ http:/// +`でウェブサイトに再度アクセスしてください。 記事のタイトルをクリックしてその記事のページにアクセスし、記事の下部にあるリンクを使用してホームページに戻ることができるはずです。

完全な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を使用して簡単なブログアプリケーションを作成しました。 データベースとの結合から始めて、さらに拡張することができます。 ただし、これはこのチュートリアルの範囲外です。 http://silex.sensiolabs.org/documentation [公式ドキュメント]は非常に役立つ可能性があり、Silexを引き続き使用する場合は必読です。

Silexが小さすぎる場合は、Symfonyフレームワークの使用を検討する必要があります。Symfonyフレームワークのチュートリアルについては、https://www.digitalocean.com/community/tutorials/how-to-install-and-get-started-をご覧ください。 with-symfony-2-on-an-ubuntu-vps [こちら]。