Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

フォームモデルをオブジェクトとして扱うさい、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]=カレンダー
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした