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