最近、著名な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は、Propel とDoctrine という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
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上でアプリケーションが構築できるのではないでしょうか。
