Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@kasackee

URLの引数をバリデーションに使いたい(Laravel)

More than 1 year has passed since last update.

結論

任意のRequestクラスに以下の関数を追加する。

    /**
     * 更新、削除時に渡されるルート引数を Request Parametersに含める。
     * ただし、すでにキーが存在している場合は上書きしない。
     * @return array
     */
    public function validationData()
    {
        $params = $this->all();
        $route_params = $this->route()->parameters();

        return $params + $route_params;
    }

なんで作ろうと思ったか?

APIを作っていて、更新処理を書いている時にふと思った。

    public function update(ProjectUpdateRequest $request, $id)
    {
        $project = Project::find($id);

        // もしデータが取得できなかったら 失敗のレスポンス
        if (empty($project)) return response()->json(['result' => 'failed']);

        $project->fill($request->all());
        $project->update();
        return response()->json($project);
    }

せっかくバリデーション専用のクラスあるのに、ここでパラメータをチェックするの違和感ある。
どうにかしてRequestクラスでできないだろうか。

Requestクラス内でルートパラメータ取得

紆余曲折あったが、パラメータを取得する関数を発見したのでそれを使用。

$this->route()->parameters()

/project/{id} だったら ['id' => xxx]の形で取得できる。

Rulesでバリデーションできるようにする

Requestクラスの rules()でチェックされるデータは validationData()で取得しているので、オーバーライドしてルートパラメーターを含めるようにする。
ただし、ルートパラメータと同じ値があったときに上書きするのは望ましくないので、array_mergeは使わずに配列をマージすることにした。

        $params = $this->all();
        $route_params = $this->route()->parameters();

        return $params + $route_params;

結果

rules()で、ルートパラメータを使ってバリデーションを行えた。

とっても満足した。
効率や生産性、拡張性は見なかったことにする。

0
Help us understand the problem. What is going on with this article?
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
kasackee
マイペース派遣エンジニア。PHPとMacで出来てます。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?