Edited at

Laravel開発メモ

More than 3 years have passed since last update.


開発準備

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


実行結果

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

画面で確認するにはルーティングの追加が必要

今回は一括で登録するが確認が容易ではないため、

個別に登録するほうがよい


/App/Http/routes.php

Route::auth();



Eloquent/エロクアント

データベースの操作をするのは

Eloquentモデルを通して行う


新規モデル作成

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

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


リレーション

 ・モデルで定義する

 ・親、子ともに定義を行う


例:「親:User」「子:Task」

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


  • 1対1/hasOne


App/Http/User.php

hasOne(App\Task);



  • 1対多/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


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ファイルが出力されている

タイプミスが多かったのでどこの記述がおかしいのか

わかるここは重宝した