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;
}
}