[ Symfony ] インストールしてHello Worldを出すまでの3ステップ | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

最近、著名なPHPのフレームワークの1つであるSymfony に触れる機会が出てきたので、利用可能な環境までのセットアップ方法を簡単にメモしておきます。

なお、セットアップした環境はCentOS5.6(さくらVPS)で行っています。



STEP1: Symfonyインストール


SymfonyはPEARからインストールする方法が最も手っ取り早いため、PEAR経由でインストールします。

デフォルトのPEARのチャンネルにはSymfonyのパッケージが存在しないため、まずはSymfonyのプロジェクト用のチャンネルを登録しておきます。


# pear channel-discover pear.symfony-project.com

次に、現在利用可能なSymfonyのバージョンを確認します。


# pear remote-list -c symfony
Channel symfony Available packages:
===================================
Package         Version
pake            1.1.4
symfony         1.4.11
YAML            1.0.5
EventDispatcher 1.0.0

配布されているSymfonyのバージョン(上記の場合、バージョン1.4.11)と、Symfonyに必要な関連パッケージ(pakeやYAMLなど)のバージョンが表示されます。

そして、最後にSymfonyをインストール。


# pear install symfony/symfony

Symfonyをインストールした後は、インストール用のディレクトリ(ここでは、symfonyというディレクトリ名)を作成しておきます。


# cd /var/www/
# mkdir symfony

開発環境であれば、Apacheのドキュメントルート以下にディレクトリを作成することも出来ますが(使い始めるまで最も手軽な方法)、余計なプログラムにアクセス可能となるためセキュリティ上は非常によろしくない状態となるため、それ以外の適当なディレクトリ内に作成しておきます。


Symfony用のディレクトリ作成が終わったら、所有者と権限を変更します。


# chown apache:apache symfony/
# chmod 775 symfony/

apacheユーザーは、その名の通りApacheの実行ユーザーです。


このステップの最後として、Apacheの設定ファイルを変更します。

なお、ここでは「SymfonyをDocumentRoot以外で動かす 」に書いたように、Apacheのドキュメントルートを丸ごとSymfony用に使うのではなく、ドキュメントルートは別のプログラムやコンテンツファイルが配置されており、URLを分ける(http://www.example.com/apps/ )ことでSymfonyのディレクトリへアクセスできるように設定しています。


Alias /apps/sf "/usr/local/lib/php/data/symfony/web/sf"
<Directory "/usr/local/lib/php/data/symfony/web/sf">
    AllowOverride All
    Allow from All
</Directory>
Alias /apps/ "/var/www/symfony/web/"
<Directory "/var/www/symfony/web">
    AllowOverride All
    Allow from All
</Directory>

※ 編集後にApache再起動


続いて、Symfonyのwebディレクトリ内にある.htaccessファイルを編集します。(下記は編集箇所)


  # no, so we redirect to our front web controller
  RewriteRule ^(.*)$ /apps/index.php [QSA,L]

サイト全体でSymfonyのアプリケーションを動かすというような場合は、特に標準のやり方 で問題ないでしょうが、既存のサイトへSymfonyを追加し、全てを移行できないといった場合は、こちらのやり方を取ってた方が便利だったりします。



STEP2: プロジェクト、アプリケーション、モジュールの作成


Symfonyのインストールが完了したら、プロジェクトの作成を行います。


$ cd /var/www/symfony/
$ symfony generate:project itboy --orm=Propel

itboyと書いている箇所が、プロジェクト名となりますので、適当なプロジェクト名に変換して実行してください。

--orm=Propelというのは、DBのアクセス方法を指定しています。

Symfonyは、PropelDoctrine という2つのORM(O/Rマッパー)が利用できます。

要は、SQLを長々と書かなくても独自のメソッドを通してテーブルにアクセスし、CRUDを実現することが出来るというものです。(もちろんSQLを直接書くこともできます)


Symfonyバージョン1.4ではデフォルトでDoctrineが採用されているため、Propelを使いたい場合は上記のようにプロジェクト作成時にオプションで指定しておく必要があります。


プロジェクトの作成が完了したら、インストールディレクトリ内に様々なディレクトリが作成されています。


$ ls
apps cache config data lib log plugins symfony test web

続いて、アプリケーションの作成です。

アプリケーションは、その名の通りSymfony内で動かすアプリ用のディレクトリを作成してくれます。


$ symfony generate:app frontend

ここでは、frontendという名前のアプリケーションを作成しています。

例えばこれをフロントのアプリケーションとし、別に管理サイト用のアプリケーションを作りたい場合は、backendという名前のアプリケーションを作ったりします。

または、後述するモジュール名で分けてしまうということも可能です。


アプリケーションを作成したら、インストールディレクトリにあるappsディレクトリ如何にアプリケーション名のディレクトリが作成されます。


$ ls apps/
frontend

アプリケーションを作成した後は、モジュールを作成します。

モジュールは、そのアプリケーション内の機能を分別するためのものです。


$ symfony generate:module frontend user

generate:moduleの後に、アプリケーション名(frontend)とモジュール名(user)を指定して実行します。

先に書いたように、ユーザー用と管理用の2つの機能がある場合は、userとadminといったモジュールを作成して、機能を分けてサイトを構築できたりします。


同じアプリケーション名でモジュールを複数作成した場合、共通のライブラリを利用するといった場合に便利に使えます。

アプリケーションディレクトリの直下にはlibというディレクトリがあり、このディレクトリはSymfonyのオートロード機能を使って明示的に呼び出す(requireなど)必要なくアクセスできます。


$ ls apps/frontend/lib/
myUser.class.php 

一方で、アプリケーションを分けてしまった場合、そのままでは他のアプリケーションで利用しているライブラリを使うことができません。

Symfonyのオートロード機能は、アプリケーション内のlibディレクトリか、Symfony直下のlibディレクトリにしか働きません。

逆に、Symfony直下のlibディレクトリはSymfony全体から呼び出し可能なため、全てのアプリケーションで利用するといった汎用的なライブラリを配置すべきディレクトリとなっています。

この辺りが、アプリケーションを複数作るかモジュールで分割するかの違いになってくるのではないでしょうか。


モジュールを作成すると、初期のアクションファイル、テンプレートファイルが作成されます。


$ ls apps/frontend/modules/user/actions/
actions.class.php
$ ls apps/frontend/modules/user/templates/
indexSuccess.php

ここまでで、Webサイトにアクセスしてみるとモジュール作成までが完了したというメッセージが表示されたSymfonyのデフォルトページが出力されるはずです。


- http://www.example.com/apps/user/index


A Day In The Boy&#39;s Life-Symfony-1



STEP3: Hello Worldの出力


最後にHellow Worldを出力してみます。

先ほどアクセスしたURLは、下記のような構造になっています。


http://ドメイン名/apps/アプリケーション用indexファイル/モジュール名/アクション名


アプリケーション用indexファイルが今回省略されている理由は後述します。
アクション名は、STEP2でモジュールを作成した際にできるactions.class.php内に定義されています。


<?php

/**
 * user actions.
 *
 * @package    itboy
 * @subpackage user
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class userActions extends sfActions
{
 /**
  * Executes index action
  *
  * @param sfRequest $request A request object
  */
  public function executeIndex(sfWebRequest $request)
  {
    $this->forward('default', 'module');
  }
}


デフォルトでは、このアクションにアクセスした場合、デフォルトのモジュール(先ほど画面)に処理がフォワードされるようになっています。

アクション名は、「executeアクション名」という命名規則で定義します。

このフォワードの処理を削除しテンプレートにHello Worldを出力してみます。


class userActions extends sfActions
{
 /**
  * Executes index action
  *
  * @param sfRequest $request A request object
  */
  public function executeIndex(sfWebRequest $request)
  {
    $this->setVar('word', 'Hello World!');
  }
}

続いて、テンプレートファイルの編集です。

デフォルトのIndexアクションに対応するテンプレートファイルが、1つ上のtemplatesディレクトリ内に存在します。

これを編集します。


<?php echo $word; ?>


これで再度、http://www.example.com/apps/user/index にアクセスしてみると画面上に「Hello World!」という文字が出力されているはずです。


テンプレートファイルは、「アクション名Success.class.php」という名前で作成します。

アクションが呼び出されると自動的にそのアクション名に紐づくテンプレートファイルが自動で呼び出されます。

明示的にテンプレートファイルを指定したい場合は、下記のようにアクションファイルを記述します。


  public function executeHoge(sfWebRequest $request)
  {
    $this->setVar('word', 'Hello World!');
    $this->setTemplate('index');
  }


上記では、新しくHogeアクションを作りました。

デフォルトだと「hogeSuccess.class.php」という名前のテンプレートが呼び出されるはずですが、明示的にindexSuccess.class.phpを呼び出すように指定しています。


最後に、URL上にアプリケーション名が指定されていない理由の説明です。

最初にアプリケーションを作成すると、Symfonyのインストールディレクトリ直下にあるwebディレクトリ内にindex.phpが作成されます。


$ ls web/
css  frontend_dev.php  images  index.php  js  robots.txt  uploads

このindex.phpは省略可能になっているのですが、実際のURLで以下のようにもアクセスができます。


http://www.exapmle.com/apps/index.php/user/hoge


試しにもう1つアプリケーションを追加してみます。


$ symfony generate:app backend
$ ls apps/
backend  frontend

この状態で、webディレクトリを確認してみるとbackend.phpファイルが増えています。


$ ls web/
backend.php      css               images     js          uploads
backend_dev.php  frontend_dev.php  index.php  robots.txt

同様の手法でbackendアプリケーションにadminモジュールの追加してみます。


$ symfony generate:module backend admin

この状態で、アクションファイル・テンプレートファイルを編集してアクセスする際のURLは下記のようになります。


http://www.example.com/apps/backend.php/admin/index


ファイル数がかなり多く、またDBアクセスやセッション、ライブラリの作成方法など覚えないといけないことも多いですが、構造を把握しまえば比較的容易にSymfony上でアプリケーションが構築できるのではないでしょうか。