人気No.1のPHPフレームワークLaravel5に入門してみる

デフォルトでユーザ認証までついてるLaravel5。
世界で人気No.1のPHPフレームワークにとりあえず入門です!

プロジェクト作成

【インストール】

C:\xampp\htdocs>composer create-project laravel/laravel lara
C:\xampp\htdocs>cd lara
C:\xampp\htdocs\lara>php artisan -V
Laravel Framework 5.6.29

【アプリケーション設定】

config/app.php

'timezone' => 'Asia/Tokyo',
'locale' => 'ja',

【エラーメッセージ日本語化】

C:\xampp\htdocs\lara>composer require laravel-ja/comja5
C:\xampp\htdocs\lara>composer update
C:\xampp\htdocs\lara>vendor\bin\comja5 -a
resources/lang/ja
  ┣auth.php
  ┣pagination.php
  ┣passwords.php
  ┣README.md
  ┗validation.php

【データベース設定】

.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

ユーザ認証

【マイグレーション】

すでにdatabase/migrationsにusersテーブルとpassword_resetsテーブルのデータがあるのでマイグレーション。

C:\xampp\htdocs\lara>php artisan migrate

Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

ん~~~ん。。。早速のトラブル—– orz

MySQLのユニーク制約の最大バイト数は767bytes。
Laravel5.4以降、標準のcharsetがutf8mb4になり1文字4bytes。
email varchar(255)の最大バイト数は 4*255=1020bytes でエラーだと。
ちなみにutf8なら3*255=765bytes。
MySQL5.7.7、MariaDB10.2.2では解消されてるらしい。

◆Laravelのcharset変更で対応。
config/database.php

    'connections' => [
・・・
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
//            'charset' => 'utf8mb4',
//            'collation' => 'utf8mb4_unicode_ci',
            'charset' => 'utf8',					// 変更
            'collation' => 'utf8_unicode_ci',		// 変更

C:\xampp\htdocs\lara>php artisan migrate

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

【パスワードリセット用メール設定(Gmail用】

.env

APP_URL=http://*****.com	# パスワードリセットリンクのURL設定

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=*******@gmail.com
MAIL_PASSWORD=*******
MAIL_ENCRYPTION=tls

【認証機能生成】

C:\xampp\htdocs\lara>php artisan make:auth

・routes/web.phpに/homeが追記される
・app/Http/Controllers/HomeController.phpが生成される
・resources/viewsに必要なビューが生成される

/homeにアクセスすると/loginにリダイレクトされ認証画面に
あら簡単!

【要認証ページの設定】

以下のように認証が必要なコントローラーのコンストラクタでmiddleware(‘auth’)を呼び出すだけ。

    public function __construct()
    {
        $this->middleware('auth');
    }

【情報取得】

Session情報取得

use Session;
$session = Session::all();

ログインユーザ情報

use Auth;
$user = Auth::user();

ルーティング

ルーティングで使用する主なHTTPメソッドは

GET 取得
POST 作成
PUT 置換
PATCH 更新
DELETE 削除

【メソッドを指定してルーティング】

routes/web.php

# GETメソッドでsampleへのアクセスはSampleコントローラーのindexメソッドへ
Route::get('sample', SampleController@index');
# GETメソッドでsample/{id}へのアクセスはSampleコントローラーのshowメソッドへ
Route::get('sample/{id}', SampleController@show');
# GETメソッドでsample/createへのアクセスはSampleコントローラーのcreateメソッドへ
Route::get('sample/create', SampleController@create');
# POSTメソッドでsampleへのアクセスはSampleコントローラーのstoreメソッドへ
Route::post('sample', SampleController@store');
# GETメソッドでsample/{id}/editへのアクセスはSampleコントローラーのeditメソッドへ
Route::get('sample/{id}/edit', SampleController@edit');
# PATCHメソッドでsample/{id}へのアクセスはSampleコントローラーのupdateメソッドへ
Route::patch('sample/{id}', SampleController@update');
# DELETEメソッドでsample/{id}へのアクセスはSampleコントローラーのdestroyメソッドへ
Route::delete('sample/{id}', SampleController@destroy');

【Resourcefulルーティング】

上記のルーティングをまとめて1行で設定できる。

Route::resource('sample', 'SampleController');

※ただし、必要なルーティングだけを記述すべし。

Route::resource('sample', 'SampleController', ['only' => ['index','show']]);
methodURLAction
[GET]sampleindex
[GET]sample/{id}show($id)
[GET]sample/createcreate
[POST]samplestore
[GET]sample/{id}/editedit($id)
[PUT/PATCH]sample/{id}update($id)
[DELETE]sample/{id}destroy($id)