Laravel 5.8 でのl5scaffoldの動かし方


LaravelにはRailsはCakePHPのようなScaffoldingがありません。
Laravel用のScaffoldパッケージはいくつかありますが、調べてみるとlaralib/l5scaffoldが最もよく使われているようです。
しかし、最後のコミットは2年前くらいで現在メンテナンスされていないようで、2019年8月時点でのLaravelのバージョン5.8では動きません。

最新版のコミットからパッケージをインストールして、1箇所ソールを修正すれば動きますので、対応した手順をまとめておきます。

‘laralib/l5scaffold’をインストール

composerでインストールします。

デフォルトのバージョンは1.0.10ですが、’dev-master’を指定すると、Laravel 5.4でIlluminate\Console\AppNamespaceDetectorTraitの名前がIlluminate\Console\DetectsApplicationNamespaceへ変更された点については対応されています。

$ composer require laralib/l5scaffold:dev-master --dev

Providerを登録

config/app.phpprovidersLaralib\L5scaffold\GeneratorsServiceProvider::classを追加します。

    'providers' => [
        ...
        Laralib\L5scaffold\GeneratorsServiceProvider::class ,
    ],

エラーの修正

ScaffoldMakeCommand::handle() does not exist

artisan make:scaffoldコマンドを実行すると以下のエラーが出ます。

$ php artisan make:scaffold Post -s "title:string,content:text"

   ReflectionException  : Method Laralib\L5scaffold\Commands\ScaffoldMakeCommand::handle() does not exist

  at /Users/foo/code/myapp/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:142
    138|             $callback = explode('::', $callback);
    139|         }
    140| 
    141|         return is_array($callback)
  > 142|                         ? new ReflectionMethod($callback[0], $callback[1])
    143|                         : new ReflectionFunction($callback);
    144|     }
    145| 
    146|     /**

  Exception trace:

  1   ReflectionMethod::__construct(Object(Laralib\L5scaffold\Commands\ScaffoldMakeCommand), "handle")
      /Users/foo/code/myapp/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:142

  2   Illuminate\Container\BoundMethod::getCallReflector()
      /Users/foo/code/myapp/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:120

  Please use the argument -v to see more details.

Laravel 5.1からArtisanコマンドを実装する場合、fireメソッドからhandleメソッドに置き換わっています。
参照 Artisan Console – Laravel 5.1 Document

どこかのバージョンでfireメソッドの後方互換性が無くなったため5.8では動かなくなったものと思われます。

Commands/ScaffoldMakeCommand.phpfireメソッドの名前をhandleに変更します。

Before

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function fire()
    {
        // Start Scaffold
        $this->info('Configuring ' . $this->getObjName("Name") . '...');

After

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        // Start Scaffold
        $this->info('Configuring ' . $this->getObjName("Name") . '...');

修正箇所は、上記のみです。

make:scaffoldの実行

以下のようにPostモデルにtitlecontentカラムを追加してScaffoldを生成します。

$ php artisan make:scaffold Post -s "title:string,content:text"

----------- scaffolding: Post -----------

+ Migration
+ Seed
+ Model
+ Controller

--- Views ---
   + create.blade.php
   + edit.blade.php
   + index.blade.php
   + show.blade.php
+ Layout
+ Error

----------- ----------------- -----------
-----------  >DUMP AUTOLOAD<  -----------
Don't forget to adjust: 'migrate' and 'routes'

以下の通りファイルができています。

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        app/Http/Controllers/PostController.php
        app/Post.php
        database/migrations/2019_08_07_072533_create_posts_table.php
        database/seeds/PostTableSeeder.php
        resources/views/error.blade.php
        resources/views/layout.blade.php
        resources/views/posts/

nothing added to commit but untracked files present (use "git add" to track)

ルーティングを追加

routes/web.phpに、生成されたコントローラのルーティングを追加

Route::resource("posts","PostController");

マイグレーションを実行

$ php artisan migrate
Migrating: 2019_08_07_072533_create_posts_table
Migrated:  2019_08_07_072533_create_posts_table (0.05 seconds)

動作確認

https://homestead.test/postsにアクセスすると以下のようにindexページが表示され、そこからCRUDのページが使えるようになります。

,