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ブランチではまだ実装されていなかったので、最後の最後に実装されたということでしょうか。


メソッドチェーンというのは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」メソッドあたりで複数のフィールドのラベルをまとめて設定できていましたが、メソッドチェーンを利用すると、ラベル・ヘルプあたりをフィールドごとに並べて設定という書き方もできるようになりました。


「これで劇的に楽になる!」というモノではありませんが、コーディングの選択肢が増えるのはありがたいですね。