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 3 years have passed since last update.

【Laravel実践】リクエストパラメータ名をスネークケースに変換する方法

Posted at

Version

  • Laravel 5.7
  • PHP 7.2.31

前提

LaravelでAPIを開発する際、キャメルケースとして書かれたリクエストパラメータ名をスネークケースに変換したい、という要望を想定します。たとえば、SPA開発においてReact.jsやVue.jsにより非同期通信でLaravelのAPIにリクエストを送信する際、フロント側としてはキャメルケースで統一したいがバックエンド側としてはスネークケースで統一したい、というケースです。

Laravel側で簡単に変換する方法をググったのですが、ベストプラクティス的な方法が出てこなかったのでここに共有します。

早速、変換してみよう。

結論だけ述べると、以下の方法で実現できます。

$request->all()でリクエストパラメータを受け取り、リクエストパラメータ名($key)に大文字が含まれる場合にスネークケースに変換・挿入、offsetUnset()で元のプロパティ名を消す、ということをやっています。

foreach ($request->all() as $key => $value) {
    if(preg_match('/[A-Z]/', $key)){
        $new_key = Str::snake($key);
        $request->merge([$new_key => $request->$key]);
        $request->offsetUnset($key);
    }
}

たとえば、TestControllerのindexで受け取ることを考えてみましょう。バリデーションを一旦無視すれば、以下のように書けるはずです。

TestController.php

class TestController
{
    public function index(Request $request)
    {
        // スネークケースに変換する処理
        foreach ($request->all() as $key => $value) {
            if(preg_match('/[A-Z]/', $key)){
                $new_key = Str::snake($key);
                $request->merge([$new_key => $request->$key]);
                $request->offsetUnset($key);
            }
        }
        // hogehoge処理
        ...
        return $request;
    }
}

応用: スネークケース変換用のクラスを作成

色々と応用する方法はあると思いますが、最終的に以下の方法で落ち着きました。

  • FormRequestクラスでバリデーション処理(※1)
  • Controllerクラスを継承する形でスネークケースに変換するクラスを作成(※2)
  • indexのController側でスネークケース変換用のメソッドを呼び出し(※3)
NormalizedController.php
// ※2
class NormalizedController extends Controller
{
    /**
     * Change request parameter from camel case to snake case
     *
     * @param object $request
     * @return object
     */
    protected function normarize_request(Object $request) : object
    {
        foreach ($request->all() as $key => $value) {
            if(preg_match('/[A-Z]/', $key)){
                $new_key = Str::snake($key);
                $request->merge([$new_key => $request->$key]);
                $request->offsetUnset($key);
            }
        }
        return $request;
    }
}
TestController.php
// FormRequestクラス(※1)
use App\Http\Requests\Test\GetRequest;

class TestController extends NormalizedController
{
    public function index(GetRequest $request)
    {
        // 呼び出し(※3)
        $this->normarize_request($request);

        // hogehoge処理
        ...
        return $request;
    }
}

参照

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?