Symfony

PHPフレームワークの1つSymfonyの話題について。割と新しいフレームワークであり、Ruby on Railsに似ているといわれる。現在のリリースは0.63。

2006年11月22日

include_metas()が正しくエンコードを処理できない問題

metaタグに関連するデータを出力する関数include_metas()はUTF-8以外のエンコードでは正しく処理されない不具合があるようだ。たとえば、Shift-JISでは以下のように変換されてしまう。

将来→・cent;来
株式→株・reg;
開発→開・shy;

EUC-JPでもこの問題は確認していて、不具合の理由を調べてみたいと思う。

view.yml

テンプレートの属性を制御するview.ymlは(init-appで指定した名前)/config/view.ymlとmodules/(module_name)/config/view.ymlが存在しており、後者のview.ymlは前者のview.ymlを継承しているので、変更される箇所だけを指定すればよい。

view.yml内のスペースの数はview.yml内の親子の関係を示しているので、スペースの数は非常に重要となる。

たとえば、has_layoutとmetasは兄弟関係にあるので、

default:
metas:
 title: タイトル

has_layout: on
layout: layout_hogehoge

は正しくレイアウトが適用されるが
default:
metas:
 title: タイトル


 has_layout: on
 layout: layout_hogehoge
はhas_layout, layoutがmetasのこの関係になってしまうので、正しく動作しない。僕はこれで一度ハマったので、注意していただきたい。

※なお、上記はそのままコピーしないでください。スペース2つが全角スペースになっています。

Symfonyのテンプレートにコメントする方法

Analyticsによるアクセス解析をしていたら意外に「symfony テンプレート コメント」というキーワードで来てもらっている人が多いことに気づく。そこで、Symfonyのテンプレートにコメントする方法について考える。

SymfonyのテンプレートはPHPそのものなので、方法としては、

<?php
/*****
ここにコメントするとか

*****/
//こうやってコメントするとか

?>
が使えると思う。ただ、Smartyのコメントのように{* *}が利用できないことは、テンプレートを実際に変更すると思われるデザイナーの人にコメントを見せられないということが問題になってくるかもしれない。(つまりテンプレートファイルをDreamWeaverなどのオーサリングソフトで処理してしまうと「?」マークになってしまってコメントが出ないからだ)

なにか良い方法があれば、追記していきたいと思う。また、知っている方がいらっしゃれば是非コメントを頂きたい。

2006年11月21日

Oops! There was an internal server error.

このエラーが出た場合には、デバッグ用のプログラムを起動させて詳細エラーを出力したほうが良いだろう。デフォルトの場合、front_dev.phpになっているので、(symfonyプロジェクトURL)/index.php/(module)/(action)/を、(symfonyプロジェクトURL)/front_dev.php/(module)/(action)/とすればよい。初歩的なエラーとしては、

・cacheディレクトリに書き込み権限がない(init-projectコマンドで実行した場合にはchmodによって適切な権限が設定されるがWindows環境では動作しないのでこの問題が起こる)
などが考えられる。

2006年11月12日

Symfonyのチートシート

http://www.symfony-project.com/weblog/2006/04/25/admin-generator-cheat-sheet.htmlこれを理解できるまでには後どれくらいかかるのだろうか??

続きを読む "Symfonyのチートシート" »

2006年10月08日

テンプレートを変更

Symfonyにて意図的にテンプレートを変更する方法はあるのだろうか?Mojavi+Smartyと同じようにreturnで変更できることがわかったのでいかのとおり示してみる。


class yesnoActions extends sfActions
{
 public function executeQuestion()
 {
  //ここで呼ばれるテンプレートはQuestionSuccess.phpだがreturnすることで変更できる
  return 'Result'; //こうすることでQuestionResult.phpを呼ぶことができる。

 }

 //バリデーションからエラーが発生した場合でもSuccessテンプレートを呼ぶ
 public function handleErrorConfirm()
 {
  //テンプレートを共通化する
  return sfView::SUCCESS;
 }
}

2006年10月02日

プロジェクトの作成

hogehogeプロジェクトをfrontendアプリケーションとして生成する場合。生成したいディレクトリ内で以下を実行します。

symfony init-project hogehoge
symfony init-app frontend

なお、SymfonyはPHP5で動作するので.phpのマッピングがPHP5になっていることが前提です。

次にパーミッション設定をします。

cacheディレクトリへ書き込みを行いますので、cacheディレクトリにApacheユーザーまたはNETWORKユーザー(IISの場合)に書き込み権限を付与します。

また、トップページを描画するには、apps/frontend/modules/defaultに以下のファイルを配置します。

actions/actions.class.php
templates/indexSuccess.php

設定項目
apps/frontend/config/view.yml タイトル類

apps/frontend/config/settings.yml

IISだと.htaccessによるrewriteが利かないので、以下の設定を行う。

prod:
.settings:
no_script_name: on



prod:
.settings:
no_script_name: off
にする。

Congratulations!
If you see this page, it means that the creation of your symfony project on this system was successful.

You can now create your model and customize default templates.


となればOK!プロジェクトの作成を開始しよう。

2006年09月18日

テンプレートを共通化する

 Symfonyではvalidateディレクトリ内にあるconfirm.ymlに定義されたルールが存在しないか、ルールに合致していれば、templateディレクトリ内の(アクション名)Success.phpが呼び出されるが、ルールに合致しない場合には(アクション名)Error.phpが呼び出される。

 入力内容のエラー処理は多くの場合入力前のテンプレートにエラーを付けて表示したりするケースが多いので、これでは同じ内容のテンプレートを2つ書かなければならず問題がある。

 そこでactionsディレクトリ内にあるaction.class.phpのhandleError(アクション名)関数をオーバーライドして戻り値を設定してあげるとテンプレートを共通化できる。

※Confirmアクションの例(ここではregistアクションからconfirmアクションに遷移するケースを考える)

public function handleErrorConfirm()
{
//通常テンプレートを返す
return sfView::SUCCESS;
}



なお、エラーメッセージはテンプレート中(今回の場合には、registSuccess.php)に
echo form_error('nickname');

などとすればよい。

2006年09月17日

Symfonyリンク集

Symfonyの有用なドキュメント一覧

Symfony API

Symfony開発日記

Symfonyチュートリアルの和訳(第5日目~第7日目)

2006年09月16日

The Definitive Guide to Symfony (Definitive Guide)

Symfonyに関する解説本が出版される見込みです。まだ日本語版なんて遠い先ですが、Symfonyは少しずつ定着しつつあるフレームワークのひとつになりそうな予感があります。

今後のWebプログラミングにおいては、フレームワークに対する理解もまた重要なスキルのひとつになることは間違いなさそうです。(クライアントアプリケーションプログラミングにおいては、フレームワーク(ロジックとビューを分離して、コントローラーで制御する)はRADにおいて当たり前のように使われているわけで、ようやくWebプログラムもそれに追いついたのかもしれない)

2006年09月09日

Symfony

PHPのフレームワーク Symfony を試してみました。
おかげさまでWindowsで検証された方がいたので、助かりました。
http://papipookoo3.com/wp/?p=4ただ、最後まで読まずにすごいところで躓きました。

実行するとつねにInternal Server Errrorが出る(それもエラーのテンプレートが)のです。

詳細なエラーが何も出ていなかったので、原因を調べるためにフレームワーク内をステップ実行するハメに。結局のところ例外出力をしているところにたどり着いて、結果的にはエラーのテンプレート(error500.html)をリネームすれば例外メッセージが出ることに気づきました。

その結果、、、
magic_quotes_gpc = Off でなかったことが原因でした。

ちゃんとHPに書いてあるのに読まなかったことが最大の時間の無駄になってしまいました。