Laravel開発メモ

#開発準備

Laravelプロジェクトの作成を行う

```
composer create-project laravel/laravel <<プロジェクト名>> --prefer-dist
```


#開発基本情報

##処理の流れ

1. ブラウザでURLを指定
2. ``App/Http/routes.php``からコントローラーに送る
3. 受け取った``App/Http/Controllers/XXXXController.php``で処理を行い、ビューに送る
4. ``resources/views/XXXX.blade.php``をブラウザに表示する

チュートリアルでは上記の流れで処理を行う
また、``App/Http/routes.php``に直接処理が書かれていたりするが
非推奨らしい

コントローラーはHttp層までの責任を負うため、
データの登録や更新処理はモデルで行うはず

そのため、マスターの登録画面だと以下の流れになる？
1. データの入力を行い、登録ボタンを押す
2. ``App/Http/routes.php``からコントローラーに送る
3. コントローラーで入力チェック（必須チェックや文字数など）を行い、モデルに送る
4. モデルで入力チェック（必須チェックや文字数など）＋整合性チェック（重複チェックなど）を行う
5. モデルでデータ登録を行い、ビューに渡す
6. ビューを表示する


##Artisan/アーティザン
プロジェクトを作成したり、
新規テーブルを追加したり、
バージョン確認をしたりとにかくお世話になる職人さん。

###よく使うコマンド

####コマンド一覧

```
php artisan list
```

####指定できるオプションの確認

```
php artisan help migrate
```

####Laravelのバージョン確認

```
php artisan --version
```

``` php:実行結果
Laravel Framework version 5.2.10
```

####全ルートの確認
``App/Http/routes.php``の内容を
リスト形式で出力します

```
php artisan route:list
```


####新規テーブルの作成

```
php artisan make:migration create_<<新規テーブル名>>_table --create=<<新規テーブル名>>
```

``database/migrations/``にファイルが作成される
作成されたファイルにカラムの定義を行い、
下記を実行すると``database/migrations/``のファイル内のテーブルがデータベースに作成される

```
php artisan migrate
```

テーブル作成後にカラムの増減を行って実行すると
既にテーブルが存在するため、sqlエラーが発生する
その場合はオプションを指定すると削除後に作成される
**全テーブルの再作成を行うため、データが全て消えることに注意**
オプションを指定すれば対象のテーブルのみできるはず・・・

```
php artisan migrate:refresh
```

###実行例：認証関連のビューを一括作成

```
php artisan make:auth --views
```

ユーザー認証の基本的な機能を一括で作成できる

- ログイン/login.php
- ログアウト/logout.php
- ユーザー登録/register.php
- ...


```:実行結果
Created View: <<プロジェクトパス>>/resources/views/auth/login.blade.php
Created View: <<プロジェクトパス>>/resources/views/auth/register.blade.php
Created View: <<プロジェクトパス>>/resources/views/auth/passwords/email.blade.php
Created View: <<プロジェクトパス>>/resources/views/auth/passwords/reset.blade.php
Created View: <<プロジェクトパス>>/resources/views/auth/emails/password.blade.php
Created View: <<プロジェクトパス>>/resources/views/layouts/app.blade.php
Created View: <<プロジェクトパス>>/resources/views/home.blade.php
Created View: <<プロジェクトパス>>/resources/views/welcome.blade.php
```

画面で確認するにはルーティングの追加が必要
今回は一括で登録するが確認が容易ではないため、
個別に登録するほうがよい

``` php:/App/Http/routes.php
Route::auth();
```

##Eloquent/エロクアント
データベースの操作をするのは
Eloquentモデルを通して行う


###新規モデル作成

``artizan``を使って新規モデルの作成を行う

```
php artisan make:model <<新規モデル名>>
```

###リレーション
　・モデルで定義する
　・親、子ともに定義を行う

#### 例：「親：User」「子：Task」

・親：子にアクセスできるように「１対１」や「１対多」をpublicメソッドで定義する

- １対１/hasOne

``` :App/Http/User.php
hasOne(App\Task);
```

- １対多/hasMany

``` :App/Http/User.php
hasMany(App\Task);
```

親と子で外部キーが異なる場合に
第2引数、第3引数で指定ができるが説明は省略

・子：自分の親にアクセスできるように設定する

``` :App/Http/Task.php
belongsTo(App\User);
```


##routes.php
``App/Http/routes.php``
プログラム一覧のようなもの

どのURLが指定された、
どの画面でリクエストを送られたという
元情報と、処理を行う先が記載されている

##.env
データベースの接続情報などの
設定を行うファイル

#開発でハマったところ
##新規プロジェクト作成時
ストレージに権限付与しないとエラーが発生し
画面が表示されない
```
chmod 777 -R /<<プロジェクトパス>>/storage
```
##app.php
``config/app.php``
自動で読み込まれるクラスや
エイリアスでクラスを設定したりするファイル。

チュートリアルでは「Input」クラスを使えるように
なっていたが新規作成した「Ver5.2.10」のファイルには
存在しなかった。

ここの前提が異なっていると調べたとおりに
記述したのに動かない！って状況が起こる。


##routes.php

``` php:routes.php
Route::group(['middleware' => ['web']], function () {
    <<新規ルート>>
}}
```

ルートグループ内に新規ルートを追加しないと
``$errors``の中身が見えなかったり、基本的なことができない

##HttpException
例外が発生した場合、通常の「403」エラーを表示したり、
付加情報をつけたりすることができる

カスタマイズした「404」エラー等も表示することができる。

はずなのだが、うまくいかない

```
Symfony\Component\HttpKernel\Exception\HttpException in /vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php line:104
 This action is unauthorized.
```

エラー発生行
```
$e = new HttpException(403, $e->getMessage());
```

#Ver5.2の新機能
##暗黙のバインディング/Implicit Binding
https://laravel.com/docs/5.2/routing#route-model-binding
・ルートモデル結束の機能の一つ
・ver5.2から追加された機能
・ver5.1では明示的バインディングが必要だった
app/Providers/RouteServiceProvider.php
上記の「boot」メソッドに使用するEloquentモデルを
定義する必要があった（例：$router->model('task', 'App\Task');）

これが必要なくなったことでリクエストでは
user_id等を送っていたのが受け取るときには
USERモデルになっているという不思議な現象が起こる

##モデルの指定の仕方
Taskモデルを指定する場合は``hasOne(Task::class)``だったのが
``hasOne(App\Task)``のようにパスで指定することができるようになった

#エラー対処
<<プロジェクトパス>>/storage/framework/views
エラーが発生すると途中まで記述されたphpファイルが出力されている

タイプミスが多かったのでどこの記述がおかしいのか
わかるここは重宝した