Laravel 機能別一覧

#入力フォーム値を取得する

`<input class="form-control" type="text" name="name">`
の`name=""`へDBのカラム名を記載する

```php:app/resources/views/hoge.blade.php
<form class="form-horizontal" method="post" action="public/create">
    @csrf                              //クロスサイトスクリプティング対策で記述する
        <div class="form-group">
          <label class="col-sm-2 control-label">名前</label>
          <div class="col-sm-6">
            <input class="form-control" type="text" name="name">
          </div>
        </div>
        <div class="form-group">
          <div class="col-sm-offset-2 col-sm-10">
            <button class="btn btn-default">送信</button>
          </div>
        </div>
</form>
```
ルーティング
`<form class="form-horizontal" method="post" action="public/create">`
`action=""`を`Route::post();`の第一引数へ記載する

```php:app/routes/web.php
Route::post('public/create', 'HogeController@create');
```
・Controller
`$request->all();`で入力した値を取得する
`$request->input('age');`で指定の値を取得する

```php:app/Http/Controllers/HogeController.php
class HogeController extends Controller
{
    public function create(Request $request){      
        $all_request = $request->all();
        return ;
    }
}
```

#画像ファイルのアップロードする

```php:app/resources/views/hoge.blade.php
    <div class="container">
        <form method="post" action="public/create" enctype="multipart/form-data">
            @csrf
            <div class="form-group">
                <label for="inputFile">File input</label>
                <input type="file" class="form-control-file" name="profile_image">
            </div>
            <button type="submit" class="btn btn-primary btn-black">アップロード</button>
        </form>
    </div>
```
ルーティング

```php:app/routes/web.php
Route::post('public/create', 'HogeController@create');
```

`app/storage/app/profiles/`に画像が保存される。

```php:app/Http/Controllers/HogeController.php
class HogeController extends Controller
{
    public function create(Request $request){
        $uploaded_image = $request->file('profile_image');

        if($request->hasFile('profile_image') && $uploaded_image->isValid()){
            $file_name = $request->file('profile_image')->getClientOriginalName();
            $path = $request->file('profile_image')->storeAs('profiles', $file_name);
        }

        return ;
    }
}
```

#バリデーションチェック(1)
[バリデーションの種類](https://readouble.com/laravel/5.8/ja/validation.html#rule-aftern)

エラーメッセージファイル`app/resources/lang/en/validation.php`をコピーして
`/ja/validation.php`を作成する。

```php:app/config/app.php
    'locale' => 'ja',
```

```php:app/Http/Controllers/HogeController.php
class HelloController extends Controller
{
    public function create(Request $request){      
        $request->validate([
            'last_name' => 'required|max:255',
            'fast_name' => 'required|max:255',
        ]);

        return ;
    }
}
```

```php:app/resources/views/hoge.blade.php
    @if($errors->any())
        @foreach($errors->all() as $error)
            {{ $error }}
        @endforeach
    @endif
```

#バリデーションチェック(2)
バリデーションファイルを新規作成する

```
$ php artisan make:rule PostalCod

Rule created successfully.
```

バリデーションルールを作成する

```php:app/app/Rules/PostalCode.php

class PostalCode implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        if(preg_match("/^\d{3}\-\d{4}$/", $value)){    //正規表現の追記
            return true;
        } else {
            return false;
        }
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return '正しい値を入力してください(:attribute)';   //エラーメッセージの編集
    }
}
```


```php:app/resources/views/hoge.blade.php
        <div class="form-group">
          <label class="col-sm-2 control-label">郵便番号</label>
          <div class="col-sm-6">
            <input class="form-control" type="text" name="postal">
          </div>
        </div>
```

`app/app/Rules/PostalCode.php`の`(:attribute)`とバインド


```php:app/resources/lang/ja/validation.php
return [
    'attributes' => [
        'postal' => '郵便番号',   //viewのname属性を指定する
    ],
];
```

```php:app/Http/Controllers/HogeController.php
use App\Rules\PostalCode;

class HogeController extends Controller
{
    public function create(Request $request){ 
        $request->validate([
            'last_name' => 'required|max:255',
            'fast_name' => 'required|max:255',
            'postal' => ['required', new PostalCode ], //新規作成のバリデーション。viewのname属性を指定する
        ]);

        return ;
    }
}


```


#認証ログイン機能

```php:バージョン5系
$ php artisan make:auth

Authentication scaffolding generated successfully.
```

`$ php artisan make:auth`で
`Command "make:auth" is not defined.`エラーが表示される場合

```php:バージョン6系
$ composer require laravel/ui --dev

Package manifest generated successfully.
```

```
$ php artisan ui vue --auth

Authentication scaffolding generated successfully.
```

```
$ npm install && npm run dev

 DONE  Compiled successfully in 10371ms  
```

新規作成されたファイルをマイグレーションする。

```
$ php artisan migrate

Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.04 seconds)
```

#認証情報を取得する

```php:app/routes/web.php
Route::get('/top', 'TopController@index'); 

Route::middleware('auth')->group(function(){  //middlewareでログイン状態のみアクセス可とする
    Route::get('mypage', function(){
        return 'mypage';
    });

    Route::get('user', function(){
        return 'userpage';
    });
});
```

```
$ php artisan make:controller TopController

Controller created successfully.
```

```php:app/app/Http/Controllers/TopController.php
use Illuminate\Support\Facades\Auth;  //追記

class TopController extends Controller
{
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function index()
    {
        $isLogin = Auth::check(); //ログイン状態を取得
        $user = auth()->user();   //ログインidの情報を取得
        if(!auth()->user()){      //ログアウトの場合、login画面へ遷移
            return redirect('login');
        }
        return;
    }
}
```

#メールアドレス認証状態を取得する

```php:app/app/User.php
class User extends Authenticatable implements MustVerifyEmail //追記
{

}
```

```php:app/routes/web.php
Auth::routes(['verify' => true]);

Route::get('top', function(){    //topアクセス時、メールアドレス認証済みのみアクセス可とする
    return 'メールアドレス認証済み'; 
})->middleware('verified');
```