symfonyとは?

symfonyとは、PHP5.1以降で開発するウェブアプリケーションのためのフレームワークです。 また、世界的に使用されているフレームワークでもあります。 小規模ウェブアプリケーションでは、その恩恵を受けることは、少ないかもしれませんが、大規模ウェブアプリケーションでは、その恩恵は多大です。

symofny1.1を利用したウェブアプリケーション

ここでは、最新のsymofony1.1.1(2008/08/08現在)を利用した簡単なウェブアプリケーションの例をご紹介します。
ドメインやメールアドレスを管理する簡単なサイトの作成を試みます。

環境:

symfony 1.1.1
  • sfGuardPlugin 2.1.0
OS
  • Windows XP Professional
xampp 1.6.7
  • Apache 2.2.9
  • PHP 5.2.6
  • PEAR 1.7.2
  • mysql 5.0.51b

準備:

xampp や symfony のインストールの説明は省略します。symfony のインストールは、pear コマンドを用いて行います。
プロジェクト名を [ symfonytest ] として作成します。

1. C:\xampp\php\php.ini
extension=php_domxml.dll のコメントアウト
2. C:\xampp\apache\conf\httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so のコメントアウトを外す(有効にする)
3. C:\xampp\apache\conf\extra\httpd-vhosts.conf
以下を追加
<VirtualHost *:80>
    DocumentRoot "C:/xampp/htdocs/symfonytest/web"
    ServerName symfonytest
</VirtualHost>
			
4. C:\WINDOWS\system32\drivers\etc\hosts
以下を追加
127.0.0.1       symfonytest

開発:

1. プロジェクトの作成
プロジェクトを作成するディレクトリ [ symfonytest] を作成します。
symfonytestディレクトリに移動し、以下のコマンドを実行して、プロジェクトを作成します。
# symfony generate:project symfonytest
成功すれば、以下のディレクトリまたはファイルができるはずです。
  • apps <DIR>
  • cache <DIR>
  • config <DIR>
  • data <DIR>
  • doc <DIR>
  • lib <DIR>
  • log <DIR>
  • plugins <DIR>
  • symfony
  • test <DIR>
  • web <DIR>
symfonytest\web に sf ディレクトリを作成し、C:\C:\xampp\php\data\symfony\sf の内容をコピーします。
2. sfGuardPlugin のインストール
サイトのユーザ管理機能を作成するために、sfGuardPlugin をインストールします。
# symfony plugin:install sfGuardPlugin
sfGuardPlugin がインストールされたことを確認します。
# symfony plugin:list
実行結果:
Installed plugins:
 symfony                        1.1.1-stable # pear.symfony-project.com (symfony)
 sfGuardPlugin                  2.1.0-stable # plugins.symfony-project.org (symfony-plugins)
3. アプリケーションの作成
アプリケーションを作成します。ここでは、[ frontend ] をアプリケーション名として作成しています。
# symfony generate:app frontend
エラーが出なければ、成功ですが、ブラウザで確認することもできます。
http://symfonytest/
symfony_create_project
4. スキーマ定義の作成
データベース名を [ symfonytest ] として、空のデータベースを作成します。
mysql> create database symfonytest
スキーマ定義ファイルを記述します。ユーザ管理部分はプラグインが作成してくれるので、それ以外を記述します。
※ yml ファイルの記述にはタブは使えません。半角スペースでインデントします
スキーマファイル: symfonytest\config\schema.yml
propel:
  _attributes:
    package: lib.model
  managed_domain:
    id:
    domain_name: { type: varchar(128), required: true }
  managed_mail_addr:
    id:
    domain_id: { type: integer, foreignTable: managed_domain, foreignReference: id }
    addr_name: { type: varchar(128), required: true }
managed_domain テーブルと managed_mail_addr テーブルを関連付けるために、managed_mail_addr テーブルの domian_id は上記のように書いています。
5. データベース設定
データベースに関する設定を propel.ini と databases.yml に行います。
symtonytest\config\propel.ini
propel.database            = mysql
propel.database.createUrl  = mysql://root@localhost/
propel.database.url        = mysql://root@localhost/symfonytest
propel.database.createUrl
データベース種類 :// ユーザ名 : パスワード @ DBサーバ
propel.database.url
データベース種類 :// ユーザ名 : パスワード @ DBサーバ / データベース名
※ 上記の例では、パスワードを省略しています データベースに SQLite を使用する場合には、以下のようにします。
propel.database.createUrl = sqlite://./C:\xampp\htdocs\symfonytest\data\sql\symfonytest.db
propel.database.url       = sqlite://./C:\xampp\htdocs\symfonytest\data\sql\symfonytest.db
symfonytest\config\databases.yml
all:
  propel:
    class:          sfPropelDatabase
    param:
      dsn:          mysql://root@localhost/symfonytest
      encoding:     utf8
データベースに SQLite を使用する場合、dsn は以下のようになります。
sqlite://./C:\xampp\htdocs\symfonytest\data\sql\symfonytest.db
6. テーブルの作成・初期データの作成とインポート
単にスキーマ定義ファイルからテーブルを作成するなら、以下のコマンドで作成可能です。
# symfony propel:build-all
今回は、ユーザ管理テーブルに入れる初期データを作成し、テーブル作成と初期データのインポートを同時に行います。
data ディレクトリに fixtures ディレクトリを作成します。
fixtures ディレクトリに、初期インポートデータファイル(例:user_import_data.yml)を作成します。
symfonytest\data\fixtures\user_import_data.yml
sfGuardGroup:
  new:
    name: admin
    description: administrator group
sfGuardPermission:
  new:
    name: admin
    description: administrator permission
sfGuardUser:
  new:
    username: admin
    password: admin
以下のコマンドで、テーブル作成と初期データのインポートを行います。
# symfony propel:build-all-load frontend
しかしここでエラーが表示されます。次のファイルを以下のように編集しておきます。
C:\xampp\php\PEAR\symfony\plugins\sfPropelPlugin\lib\task\sfPhing.class.php
21行目
function printVersion() { → public static function printVersion() {

成功すれば以下のテーブルが作成されます。
mysql> show tables;
  managed_domain
  managed_mail_addr
  sf_guard_group
  sf_guard_group_permission
  sf_guard_permisson
  sf_guard_remember_key
  sf_guard_user
  sf_guard_user_group
  sf_guard_user_permission
7. メニュー作成
サイトのメニュー画面を作成します。
モジュール名を [ menu ] として作成しています。
# symfony generate:module frontend menu
メニュー画面のアクションを編集します。
symfonytest\apps\frontend\modules\menu\actions\actions.class.php
public function executeIndex()
{
  return sfView::SUCCESS;
}
メニュー画面を作成します。
symfonytest\apps\frontend\modules\menu\templates\indexSuccess.php
1 <h1 style='background:powderblue;'>ドメイン管理</h1>
2 <hr />
3 <ul>
4 	<li><?php print link_to('ドメインリスト', 'domain/list'); ?></li>
5 	<li><?php print link_to('メールアドレスリスト', 'mailaddr/list'); ?></li>
6 </ul>
5,6行目 link_to 関数を用いて、リンクを作成します。第1引数は、<リンク名>、第2引数は<module/action>を示しています。
今は、まだモジュール domain も mailaddr もありませんが、このようにしておきます。
ブラウザでは、以下で確認できます。
http://symfonytest/frontend_dev.php/menu
8. アドミンジェネレータを使用したモデルの作成
ドメインやアドレスの CRUD を行うために、アドミンジェネレータで管理画面を作成します。 CRUD とは、Create(登録)Read(読込)Update(編集)Delete(削除)の頭文字であり、一般的なアプリケーション機能を指します。 CRUDジェネレータでも同様の管理画面を作成することは可能ですが、ここではアドミンジェネレータを使用することにします。
CRUDジェネレータを利用したモデルの作成
# symfony propel:generate-crud frontend domain ManagedDomain
アドミンジェネレータを用いて、domain モジュール・ManagedDomain モデル、mailaddr モジュール・ManagedMailAddr モデルをそれぞれ作成します。
# symfony propel:init-admin frontend domain ManagedDomain
# symfony propel:init-admin frontend mailaddr ManagedMailAddr
成功すれば、symfonytest\lib にmodule ディレクトリが作成され、中にファイルが作成されます。
9. sfGuardプラグインを設定する
sfGuardプラグインを設定して、認証のあるサイトらしいものにしていきます。
symtonytest\apps\frontend\config\settings.yml
以下を追加します。
all:
  .actions:
    login_module:  sfGuardAuth
    login_action:  signin
    secure_module: sfGuardAuth
    secure_action: secure
  .settings
    enabled_modules: [default, sfGuardAuth, sfGuardGroup, sfGuardUser, sfGuardPermission]
symtonytest\apps\frontend\config\factories.yml
以下を追加します。
all:
  user:
    class: sfGuardSecurityUser
sfGuardプラグインで提供される管理画面を表示するには以下にアクセスします。
  • ユーザ登録画面:http://symfonytest/frontend_dev.php/sfGuardUser
  • グループ登録画面:http://symfonytest/frontend_dev.php/sfGuardGroup
  • 権限登録画面:http://symfonytest/frontend_dev.php/sfGuardPermission
sf_guard_user
10. ルーティング設定
ルーティングの設定を行います。
symfonytest\apps\frontend\config\routing.yml
以下を追加します。
my_menu:
  url:   /menu
  param: { module: menu, action: index }

sf_guard_signin:
  url:   /login
  param: { module: sfGuardAuth, action: signin }

sf_guard_signout:
  url:   /logout
  param: { module: sfGuardAuth, action: signout }

sf_guard_password:
  url:   /request_password
  param: { module: sfGuardAuth, action: password }
11. 認証時、遷移設定
プラグインの認証時の遷移について設定を行います。
symfonytest\apps\frontend\config\app.yml
以下を追加
all:
  sf_guard_plugin:
    success_signin_url:  @my_menu
    success_signout_url: @sf_guard_signin
    remember_key_expiration_age: 
12. サイト全体をログインしないとアクセスできないようにする
ログインに成功しないと、どのページにもアクセスできないようにします。
symfonytest\apps\frontend\config\security.yml
is_secure: off → is_secure: on
13. ログイン画面からログインしてみる
sfGuardプラグインが機能しているか、ログイン画面からログインしてみます。 以下のURLでログイン画面を表示させます。
http://symfonytest/frontend_dev.php/login
ログインすることができ、メニュー画面が表示されれば成功です。

ログアウトする時は、http://symfonytest/frontend_dev.php/logout にアクセスすれば、 ログアウトし、ログイン画面を表示します。
14. メニュー画面にログアウトのリンクを表示させる
毎回、ログアウトの際に、アドレスバーに入力するのは面倒なので、メニュー画面にログアウトのリンクを設置します。
symfonytest\apps\frontend\modules\menu\templates\indexSuccess.php
以下を追加します。
<?php print link_to('ログアウト', '@sf_guard_signout'); ?>
15. .htaccess の設定
http://symfonytest/
にアクセスした際に表示されるログイン画面よりログインすると、メニュー画面を表示することができません。 メニューを表示するには、
http://symfonytest/frontend_dev.php/menu
へ遷移する必要があります。ですので、.htaccessの設定を変更して対応します。
symfonytest\web\.htaccess
以下のように修正します。
# no, so we redirect to our front web controller
RewriteRule ^(.*)$ index.php [QSA,L]
                  ↓
# no, so we redirect to our front web controller
RewriteRule ^(.*)$ frontend_dev.php [QSA,L]
16. バリデーション設定
ドメイン管理画面のフォームにバリデーション設定を行います。
symfonytest\apps\frontend\modules\domain ディレクトリに validate ディレクトリを作成します。
validate ディレクトリに、<アクション名>.yml となるようにファイルを作成します。
ここでは、edit.yml です。
edit.yml
以下を記述します。
fields:
  managed_domain{domain_name}: # モジュール名 { フィールド名 }
    required:
      msg: "ドメイン名を入力してください" # メッセージの表示
validate_domainname

メールアドレス管理画面にもバリデーション処理を行う場合は、同様の作業を行って下さい。
17. symfony ツールバーを表示しないようにする
ブラウザで確認すると、画面右上にsymfony ツールバーが表示されています。これが表示されないようにするには、次のファイルを修正します。
symfonytest\apps\frontend\config\settings.yml
以下のように修正します。
dev:
  web_debug:      on
           ↓
dev:
  web_debug:      off
18. キャッシュのクリア
時々、設定を変更した際に、ブラウザに変更が反映されないことがあります。
その際には以下のコマンドを実行しキャッシュをクリアして下さい。
# symfony cache:clear
19. その他
・ページタイトルを編集する
ページタイトルを編集するには、以下のファイルを編集します。
symfonytest\apps\frontend\config\view.yml
title のコメントアウトを外し、デフォルトで "symfony project" となっている箇所を修正します。
・表示されるテーブルのカラム名を日本語にする
通常、作成したテーブルのカラム名がそのまま表示されます。
本サンプルのドメイン名のリストや新規登録時、"domain_name" とカラム名がそのまま表示されるはずです。この箇所が日本語で表示されるように修正します。
symfonytest\apps\frontend\modules\domain\config\generator.yml
以下のように追加します。
generator:
  class:              sfPropelAdminGenerator
  param:
    model_class:      ManagedDomain
    theme:            default
                 ↓
generator:
  class:              sfPropelAdminGenerator
  param:
    model_class:      ManagedDomain
    theme:            default

    fields:
      domain_name: { name: ドメイン名 }

おわりに
このウェブアプリケーションでは、プラグインによる認証やデータベースの利用について説明しました。 もし、ログインユーザの管理も行いたければ、backend アプリケーションを作成し、ユーザ管理画面が表示されるように追加を行って下さい。

この例では、MySQL を用いましたが、PostgreSQL、SQLite、Oracle、MSSQL、odbc といった、他のデータベースを利用することも可能です。 場合にもよりますが、もし持ち運びを想定した利用がある場合には、SQLite を使うのが便利でしょう。

Izumi Cyber Networks Inc.