Laravel入門者向け 1時間でCRUDが使えるようになるLesson

Laravelのインストールや開発環境については既にそこら中にたくさん転がっているのでここでは割愛します。
さらにフォルダ構成についてもそこらへんに転がっているので必要最小限だけを解説します。

基本的に個人の健忘録的なメモなのであまり期待しないで下さい。


## Laravelのコマンドの基本
基本はLaravelのフォルダからコマンドを叩いて使います
よく使うコマンドだけ紹介

```php
php artisan

// オプトインサーバー起動
php artisan serve

// model制作(DB設定 カラム設計 バリデート)
// -mオプションを付けるとMigrationファイルも同時に生成してくれる
php artisan make:model ファイル名 -m

// コントローラー生成
php artisan make:controller ファイル名Controller

// コントローラー生成 CRUDリソース付き
php artisan make:controller ファイル名Controller --resource

// DB生成実行パート
php artisan migrate

// DB作り直し
php artisan migrate:fresh

// DB直前の命令を戻す
php artisan migrate:rollback

// ルーティングリスト確認
php artisan route:list

```

私が基本的によく使うコマンドは上記です。

## ここからサクッと必要項目についての流れ

## ルーティングを理解する

```php
**初期状態**
Route::get('/', function () {
    return view('welcome');
});
```

```php
**ざっくりルーティングを理解する**
Route::①アクセスしてきたメソッド('②グローバルアドレス', function () {
    return view('welcome'); ③ビューを選択
});
```
とりあえず３つの要素で構成されている
Route:: はお約束として
- getはメソッドを表すがgetとpost以外は基本使わない
- getの引数にある '/' は http:://ドメイン/ にアクセスがあった場合
- ③はresorce/views フォルダにあるファイル名を指定している
views/配下にあるフォルダを指定する場合は「.」で繋ぐ

```php
**例**
/resource/views/test/main.blade.php
return view('test.main');
```
とすればOK!

### コントローラー＆メソッドを呼び出す
```php
Route::get('/sub','subsController@index');
```
コントローラーファイルは基本 /app/http/controllers/ 配下にある
上記は http://ドメイン名/sub にアクセスがあった場合に /app/http/controllers/subsController.php ファイルのindex()メソッドを呼び出す例

### 他にも出来るルーティング web.php
```php
**初期状態**
Route::get('/', function () {
	$math = 2 * 3;
	$data = '2x3は'.$math.'でした！';
    return $data;
});
```
のようにViewを使わなくても表示されます。

## モデルとマイグレーション
モデルはデータベースのことです。
マイグレーションは簡単に言えばDBテーブル設計のことで、リレーションを設定したりバリデーションルールを決めれます。

- 作りたいテーブルを生成
```shell
php artisan make:model tests -m
```
/database/migrations から 日付_create_tests_table.php が生成される

```php
public function up()
    {
        Schema::create('tests', function (Blueprint $table) {
            $table->id();
            $table->string('name','20');
            $table->string('descript');
            $table->timestamps();
        });
    }
```
upの部分に必要なカラムを制作して php artisan migrate を実行するだけ

### バリデーションとテーブルのルールを制作
/app 配下にテーブル名.phpのファイルが制作されているので該当するファイルを開く

```php
protected $guarded   = ['id'];
または
protected $fillable = [
        'name', 'email', 'password',
    ];
```
などのルールを制作しておかないとデータ追加や更新の時にfill()メソッドが使えないのでどちらかを必ず設定しておくこと。

予約語 $guarded $fillable はホワイトリストとブラックリストの関係で成り立っており、$guaeded にidを指定しているとautoIncrementを設定していた時にIDが勝手に変更されてエラーが出ないように設定する意味がある。

### 必要最低限のバリデーションルールの設定
同じく/app/テーブル名.php を開いて設定

```php
public static $rules = [
    	'name'   => 'required',
    	'descript' => 'required',
    ];
```
not null にしたいカラムに上記のように設定しておくとNullの場合にエラーを吐きます。

### migration補足と注意事項
注意：XAMPPのMariaDBを使う場合はマイグレーションを実行した時にエラーが出ます。
文字数問題のことなんですが初見殺しなので記載

```php
「/app/Providers/AppServiceProvider.php」に「use Illuminate\Support\Facades\Schema;」と「Schema::defaultStringLength(191);」の2行を追記すれば解決するとの事です。

...
use Illuminate\Support\Facades\Schema;
...
public function boot()
{
	Schema::defaultStringLength(191);
}
...
作成に失敗したDB内のテーブルを全て削除して、再びmigrateを実行すると問題なくtableが作成されました。
```
また /config/database.php のcharset設定で utf8mb4を utf8_unicode_ciに設定すればOKです。
[エラー詳細はこちら](https://qiita.com/oishis/items/88744f017601f3084ab7)

## コントローラー
コントローラーの役割は モデルとビューを繋ぐ役割だと考えています。
かなりざっくりですが最低限のCRUDを実装するためだけなら良いと思います(異論は認める)

### use宣言
Modelと連携する為にはどのテーブルを使うかを宣言する必要があります。

```php
use App\テーブル名; (複数形)
```
use宣言をしておいて各メソッドでテーブルの情報を呼び出しデータをビューに渡します。
またコントローラーはデータ加工パートでもあるのでごにょごにょした結果をビューに渡す流れもアリです。

```php
シンプルなコントローラーでテーブルデータ呼び出しの例
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\テーブル名;

class subsController extends Controller
{
	public function index()
	{
		$data	= テーブル名::get();
		// dd($data);
		return view('sub',compact('data'));
	}
}
```
### リクエストを受ける時

```php
public function post(Request $req)
	{
		$data	= new \App\テーブル名;
		$data->fill($req->all())->save();
		return redirect('/sub')->with('flash_message', '投稿が完了しました');
	}
```
上記の(fill())フィルは（バリデーションとテーブルのルールを制作）で述べた予約語guardedかfillableを設定しておくことで使えます。

### 指定されたデータの検索

とりあえずfindでデータを表示出来る状態

```php
public function edit(Request $id)
	{
		// echo $id->id;
		$data	= $id->id;
		$ids = テーブル名::find($id->id);
		return view('test.edit',compact('ids','data'));
	}
```

## Bladeを使ったテンプレートレイアウト
Bladeを使ってびっくりしたのが子から親レイアウトを呼び出して使う流れです。
/resources/views/ に子ファイルを置き layouts にレイアウトの枠組みを設置して使う流れになってます。

慣例では layouts/メソッド名のフォルダ/ を作ってその中にレイアウトの大枠を置く感じです。
別に好きに指定指定良いようなのでLaravelは自由度が高いですね。

また、コントローラーの return view() で指定するのはあくまでコンテンツを呼び出すだけでOKです。

ちょっと疲れたので、この続きはまた後ほど書きたいと思いますｗ