LoginSignup
0
0

More than 5 years have passed since last update.

Laravelでコントローラで使っているパスカルケースのクラス名から、ルート用のスネークケースに変換して登録する

Posted at

LaravelでコントローラのAPIを一括で登録できないかと調べていて、クラス名の配列から登録するようにしました。

api.php
    // ルートのTips @see https://qiita.com/sawadashota/items/65da8557a86c03204027
    // 補助 @see https://qiita.com/sympe/items/9297f41d5f7a9d91aa11
    // API呼び出しの場合、index(一覧), store(新規作成), show(1ユーザ情報), update(編集),destroy(削除) を使う
    // create(新規作成用のフォームGET), edit(編集用のフォームGET)は使わない
    $routeDefaultSet = ['only' => ['index', 'store', 'show', 'update', 'destroy']];

    // 複数形の名称から単数形、先頭を大文字にする @see https://stackoverflow.com/questions/37513473/laravel-get-model-by-table-name
    $controllers = [
        SaleController::class,
        SaleItemController::class,
       // ... 以下コントローラが続く
    ];

    foreach ( $controllers as $controller ) {
        // App\Http\Controllers\UserController::class => UserController
        $controllerName = preg_replace('/([^\\\\]+)$/', '$1', $controller);
        $controllerName = str_replace('Controller', '', $controllerName); // 末尾のControllerを省く
        $snaked = Str::snake($controllerName); // SaleItem => sale_item へ変換
        // 次のような形で基本CRUDのエンドポイントを定義 Route::apiResource('sale', SaleController::class, $routeDefaultSet);
        Route::apiResource($snaked, $controller, $routeDefaultSet);
    }

Str:snake()でパスカルケースからスネークケースに変換できました。
https://laravel.com/api/5.8/Illuminate/Support/Str.html

その他

クラス名は名前空間のフルパス( \App\Http\Controllers\UserController )で記述して補完と静的解析を効かせたかったんですが、フルパスからクラス名への変換が出来ませんでした。
インスタンス化すればできそうではあるんですが…。

$class = \App\Http\Controllers\UserController::class;

// \App\Http\Controllers\UserController => UserController に変換ができない

Best way to new up a class with only classname as a string
PHP: ReflectionClass::getName - Manual
PHP: get_class - Manual

0
0
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
0
0