symfony 1.3のウィジェット系メソッドでメソッドチェーン(fluid interface)
symfony 1.3の日本語ドキュメント翻訳も始まって、ボチボチ公式サイトでも表示され始めるんじゃないかと思います。(翻訳作業をされている方、お疲れ様です。)
1.3の新機能についてまとめてある「whats-new」を読んでいて、1つ気になる機能があったのでピックアップしてみます。
ここに、「Fluent Interface」という節があります。以下英語版から引用
Fluent Interface
The widgets now implement a fluid interface for the following methods:
- sfWidgetForm: setDefault(), setLabel(), setIdFormat(), setHidden()
- sfWidget: addRequiredOption(), addOption(), setOption(), setOptions(), setAttribute(), setAttributes()
- sfWidgetFormSchema: setDefault(), setDefaults(), addFormFormatter(), setFormFormatterName(),setNameFormat(), setLabels(), setLabel(), setHelps(), setHelp(), setParent()
- sfWidgetFormSchemaDecorator: addFormFormatter(), setFormFormatterName(), setNameFormat(), setLabels(),setHelps(), setHelp(), setParent(), setPositions()
どうやら、これらのメソッドで「メソッドチェーン」が実装されたということのようです。
数日前にチェックアウトした1.3ブランチではまだ実装されていなかったので、最後の最後に実装されたということでしょうか。
- http://trac.symfony-project.org/changeset/22446/branches/1.3/lib/widget/sfWidgetForm.class.php
- 09/26/09 09:55:47 ですね
メソッドチェーンというのはjQueryやDoctrineを使っている方にはおなじみかと思いますが、たとえは上記のsfWidgetFormクラスのメソッドであれば、メソッドの戻り値がオブジェクト自身になっているため、「->」でメソッドをつなげて記述できるというものです。
例えば今までだと次のようにコーディングしていました。
<?php // どこかのフォームクラスのconfigureメソッド内 $this->widgetSchema['login_name']->setDefault('default name') $this->widgetSchema['login_name']->setLabel('ログイン名');
これが、メソッドチェーンを使うと以下のようにコーディングできるようになります。
<?php // どこかのフォームクラスのconfigureメソッド内 $this->widgetSchema['login_name'] ->setDefault('default name') ->setLabel('ログイン名');
同じようなメソッドチェーンの仕組みがsfWidgetFormSchemaにも導入されていますので、以下のようにも記述できます。
<?php // どこかのフォームクラスのconfigureメソッド内 $this->widgetSchema ->setDefault( 'login_name', 'default name') ->setLabel( 'login_name', 'ログイン名') ->setHelp( 'login_name', 'ログイン名(メールアドレス)を入力してください') ->setDefault( 'login_password', 'パスワードを入力してください') ->setLabel( 'login_password', 'パスワード') ->setHelp( 'login_password', '半角英数字8文字で入力してください');
今までは「setLabels」メソッドあたりで複数のフィールドのラベルをまとめて設定できていましたが、メソッドチェーンを利用すると、ラベル・ヘルプあたりをフィールドごとに並べて設定という書き方もできるようになりました。
「これで劇的に楽になる!」というモノではありませんが、コーディングの選択肢が増えるのはありがたいですね。