書籍「PHPフレームワーク Laravel Webアプリケーション開発」のまとめ。
点数
92点
感想
Laravelを使いこなすための情報がまとめられていた。
特に、第2章「Laravelのアーキテクチャ」のサービスコンテナやサービスプロバイダ説明がわかりやすかった。
内容的にはかなりの良書だと思うが、誤記がとても多いのが残念だった。
環境構築
Laradock
DockerでのLaravel開発環境。
nginx, php-fpm, MySQL, workspace, phpMyAdminなどのコンテナが用意されている。
Laradockでの開発環境構築手順
git clone https://github.com/Laradock/laradock.git
cd laradock; cp env-example .env
vi .env
APP_CODE_PATH_HOST=../sampleapp
※ 使用済みポートがある場合は変更する。ex)MYSQL_PORT=3308
docker-compose up -d nginx mysql workspace
※ docker for Macでは設定の「Use gRPC FUSE for file sharing」をオフにしないとmysqlコンテナが起動しなかった。docker-compose exec --user=laradock workspace bash
composer create-project laravel/laravel . --prefer-dist "5.5.*"
- root/rootでMySQLに接続してデータベースを作成し、sampleapp/.envにDB接続情報をセットする
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=root
DB_PASSWORD=root - http://localhostへアクセス
※以降は、laradockディレクトリでdocker-compose up -d nginx mysql workspace
、sampleappディレクトリでphp artisan xxx
を実行する。
ユーザー認証
ユーザ登録の実装
Laravelインストール時に作成されるRegisterControllerクラスのshowRegistrationFormメソッドとregisterメソッドで行う。
アクションはRegisterUsersトレイトに実装がある。
RegisterControllerでprotected $redirectTo = '/home';
となっているため、登録後は/homeにリダイレクトされる。
php artisan migrate
- resources/views/auth/register.blade.phpを作成
Route::get('/home', function () { return view('home'); });
Route::get('auth/register', 'Auth\RegisterController@showRegistrationForm');
Route::post('auth/register', 'Auth\RegisterController@register');
- resources/views/auth/register.blade.phpを作成
<form method="post" acction="/auth/register">
{{csrf_field()}}
<p>名前: <input type="text" name="name"><span>{{ $errors->first('name') }}</span></p>
<p>メールアドレス: <input type="text" name="email"><span>{{ $errors->first('email') }}</span></p>
<p>パスワード: <input type="password" name="password"><span>{{ $errors->first('password') }}</span></p>
<p>パスワード(確認): <input type="password" name="password_confirmation"></p>
<p><button type="submit">送信</button></p>
</form>
- resources/views/home.blade.phpを作成
@if(Auth::check())
{{ \Auth::user()->name }}さん
@else
ゲストさん:<a href="/auth/register">会員登録</a>
@endif
ログインの実装
Laravelインストール時に作成されるLoginControllerクラスのshowLoginFormメソッドとloginメソッドで行う。
アクションはAuthenticatesUsersトレイトに実装がある。
LoginControllerでprotected $redirectTo = '/home';
となっているため、ログイン後は/homeにリダイレクトされる。
AuthenticatesUsersのlogoutメソッドでreturn redirect('/');
となっているため、ログアウト後は/にリダイレクトされる。
(変更したい場合は、LoginControllerでlogoutメソッドをオーバーライドする)
- route/web.phpに追加
Route::get('auth/login', 'Auth\LoginController@showLoginForm');
Route::post('auth/login', 'Auth\LoginController@login');
Route::get('auth/logout', 'Auth\LoginController@logout');
- resources/views/auth/login.blade.phpを作成
<form method="post" acction="/auth/login">
{{csrf_field()}}
<p>メールアドレス: <input type="text" name="email"><span>{{ $errors->first('email') }}</span></p>
<p>パスワード: <input type="password" name="password"><span>{{ $errors->first('password') }}</span></p>
<p><button type="submit">ログイン</button></p>
</form>
イベント
イベントを使用したメール送信の例
会員登録時にメールを送信するサンプル。
- mailhogを起動
docker-compose up -d mailhog
http://localhost:8025で受信メールを確認できるようになる。
※ ポートが使用済みの場合はdocker-compose.ymlを変更する。
mailhog:
build: ./mailhog
ports:
– “1026:1025”
– “8026:8025” - sampleapp/.envのMAIL_HOSTを変更
MAIL_HOST=mailhog
MAIL_PORT=1025 - イベントとリスナーを登録
app/Providers/EventServiceProvider.phpの$listen配列にリスナークラスを登録する。
キーがイベントクラス、値がリスナークラス。protected $listen = [
\Illuminate\Auth\Events\Registered::class => [ \App\Listeners\RegisteredListener::class ],
];
※ 文字列でもいいが、::classを使う方が一般的。
※ デフォルトで登録されている’App\Events\Event’の定義は不要なので削除。 - リスナークラスの作成
php artisan event:generate
EventServiceProvider.phpに登録してあるイベントクラスとリスナークラスが生成される。
※ 今回の場合、app/Listeners/RegisteredListener.phpのみが生成される。
通常はイベントとリスナーの両方を作成する必要がある。
ここではイベントはLaravelの認証処理に用意されているクラス(Illuminate\Auth\Event\Registered)を使うため、リスナーのみ作成する。 - app/Listeners/RegisteredListener.phpに処理を実装
handleメソッドに処理を記述する。
class RegisteredListener
{
/**
* @var Mailer
*/
private $mailer;
/**
* @var User
*/
private $user;
/**
* Create the event listener.
*
* @param Mailer $mailer
* @param User $user
*/
public function __construct(Mailer $mailer, User $user)
{
$this->mailer = $mailer;
$this->user = $user;
}
/**
* Handle the event.
*
* @param Registered $event
* @return void
*/
public function handle(Registered $event)
{
$user = $this->user->findOrFail($event->user->getAuthIdentifier());
$this->mailer->raw('会員登録完了しました', function($message) use ($user) {
$message->subject('会員登録メール')->to($user->email);
});
}
}