CRUD機能があるアプリをlarabelで最短で作成する

CRUD機能のあるアプリを最短でlaravelに搭載します。
基本的にmodel,view,controllerをいじればいいだけなので、コマンドで自動生成できる部分が多いです。
今回は、post(投稿)ができるアプリを例にとっています。


#model

###1,migrationファイルの作成
まずはpostを保存できるようにします。

tableの作成。
この時、table名は複数形であることに注意

**Laravelの命名規則では、「table名は複数形、モデルは単数形」となっている**

```shell
$ php artisan make:migration create_posts_table
```


###2,database/migrations以下のmigrationファイルの編集

```php:web.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            //追加したいデータ型とカラムを追加
            $table->string('message');
            $table->timestamps();
        });
    }

/**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }

}

```

###3,migrate実行

```shell
$  php artisan migrate
```

###4,モデルの作成
こちらは単数形
**Laravelの命名規則では、「table名は複数形、モデルは単数形」となっている**

app/Post.phpが作成される

```shell
$ php artisan make:model Post
```
生成されたPost.phpにおいて、\$guardedはユーザーが値を変えないよにする項目を指定する。
idはユーザーがフォームから独自に送ってくるものではなく、自動的に割り振られるため、
「protected $guarded = array('id');」を追加することで、idがnullでもエラーにならないようにする。

つまり、ユーザーが「id」というパラメーターを送ってきても受け付けないようにする


```php:Post.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $guarded = array('id');
//以下のように独自のメソッドも定義できる
//    public function getData()
//    {
//        return $this->id. ": this is :" . $this->message;
//    }
}

```

*ちなみに-mオプションで、モデルの作成とマイグレーションファイルの作成を同時に一発で作成できる


```shell
$ php artisan make:model Post -m
```

#view
resources/views/の下に、postディレクトリを作成し、
index.blade.php,show.blade.php,create.blade.phpなどを作成。


#controller

--resourceオプションで、Resourcefulなアクションを自動で定義したコントローラーを生成します

```shell
$ php artisan make:controller PostController --resource
```
app/Http/Controllers/PostController.phpが作成されます。

controllerでは、「use App\Post;」の追記を忘れないでください。
コントローラーに使用したいモデルがあればそのモデルその都度このように追加していきます。


```php:PostController.php
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

//以下の追記を忘れない
//他にもモデルあればそれも追加
use App\Post;

class PostController extends Controller
{
    public function index()
    {
        $items = Post::all();
        return view('post.index', ['items' => $items]);
    }

    public function show($id)
    {
        $item = Post::find($id);
//        return $item->toArray();
        return view('post.show', ['item' => $item]);
    }

    public function create()
    {
        return view('post.create');
    }
    
    //フォームから送られたRequest $requestを受け取る
    public function store(Request $request)
    {
        $post = new Post;
        $form = $request->all();
        unset($form['_token']);
        $post->fill($form)->save();
        return redirect('/post');
    }


   public function edit($id)
   {
       //
   }

   public function update(Request $request, $id)
   {
       //
   }

   public function destroy($id)
   {
       //
   }
}
```
#routing

最後にroutingを設定します。これも自動でCRUDに対応するroutingを設定してくれます。

```php:web.php
Route::resource('post', 'PostController');
```
APIを作成したい場合はapi.phpに記載します。
(APIではUIが必要ないので、createとeditはurlを生成しないようにしています)

```php:api.php
Route::resource('coupon', 'CouponController', ['except' => ['create', 'edit']]);
```
ルーティングは以下のコマンドで確認できます。

```shell
$ php artisan route:list
```


#seeder
ここで一通り機能が完成したので、確認してみたいのですが、DBにデータが溜まっていないので確認がうまくできません。

そのために「seeder」という機能を使い、テーブルにレコードを追加しましょう。

```shell
$php artisan make:seeder PostsTableSeeder
```
完了したら
database/seeds/PostsTableSeeder.phpというファイルが作成されていますので、確認してください。

runメソッド内にレコードを作成するための処理を書いていきます。

```php:database/seeds/PostsTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class PostsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $params = [
            'message' => 'Hello',
        ];
        DB::Table('posts')->insert($params);

        $params = [
            'message' => 'World',
        ];
        DB::Table('posts')->insert($params);
    }
}

```

次にdatabase/seeds/DatabaseSeeder.phpを編集します。

```php:database/seeds/PostsTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
         $this->call(PostsTableSeeder::class);
    }
}
```
これでファイルの編集は終了です。
以下のコマンドで実行してください

```shell
$ php artisan db:seed
```

最後にサーバーを立ち上げて確認してみてください！

```shell
$php artisan serve --host 0.0.0.0
```