Help us understand the problem. What is going on with this article?

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

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

taka159
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away