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.php
のproviders
にLaralib\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.php
のfire
メソッドの名前を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
モデルにtitle
とcontent
カラムを追加して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のページが使えるようになります。