1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Yii2Advent Calendar 2014

Day 9

ActiveFormのクエリ文字列をプレーンにする

Posted at

フォームモデルをオブジェクトとして扱うさい、ActiveForm は非常に便利なのですが、とくに工夫しないモデルをはめ込むと、このようにクエリパラメータにクラス名を含む形になってしまいます。

?EntrySearch[tag]=yii2&EntrySearch[title]=アドベント&EntrySearch[body]=カレンダー

POST であれば複雑なクエリ文字列でもかまわないのですが、検索フォームのように GET でリクエストしたい場合は URL が過剰に複雑になってしまいます。

上の EntrySearch[] を取り除くには、フォームモデルで formName() メソッドを定義します。

class EntrySearch extends ...
{
    public function formName()
    {
        return '';
    }
}

これだけで、ActiveForm も $model->load(...) もそのまま何もしなくても、クエリ文字列は次のようになります。

?tag=yii2&title=アドベント&body=カレンダー

ただし、あくまで GET リクエストな検索用フォームのモデルのような、ユーザーから汚い文字列を隠したい場合に絞って使うのがよいでしょう。

フーム名を空にすると、型情報がなくなってしまいます。似たようなフィールドの別の型のモデルが送られてきたとき、Model::load() は型の違いを無視してフィールドに読み込んでしまいます。たとえば、もしモデルに page プロパティがあったら、ページャーが page を指定したときその値で上書きされてしまいます。

開発中どんなフォームになるか定まらないうちは指定せず、最後にやるかやらないか、やるとしても代わりの短い名前を使ったほうが良いのではないかを、慎重に選択しましょう。

もしかしたら、こんなクエリ文字列でも十分かもしれません。

?es[tag]=yii2&es[title]=アドベント&es[body]=カレンダー
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?