「PHPフレームワーク Laravel Webアプリケーション開発」の感想・備忘録1

スポンサーリンク

書籍「PHPフレームワーク Laravel Webアプリケーション開発」のまとめ。

点数

92

感想

Laravelを使いこなすための情報がまとめられていた。

特に、第2章「Laravelのアーキテクチャ」のサービスコンテナやサービスプロバイダ説明がわかりやすかった。

内容的にはかなりの良書だと思うが、誤記がとても多いのが残念だった。

環境構築

Laradock

DockerでのLaravel開発環境。
nginx, php-fpm, MySQL, workspace, phpMyAdminなどのコンテナが用意されている。

Laradockでの開発環境構築手順

  1. git clone https://github.com/Laradock/laradock.git
  2. cd laradock; cp env-example .env
  3. vi .env
    APP_CODE_PATH_HOST=../sampleapp
    ※ 使用済みポートがある場合は変更する。ex) MYSQL_PORT=3308
  4. docker-compose up -d nginx mysql workspace
    ※ docker for Macでは設定の「Use gRPC FUSE for file sharing」をオフにしないとmysqlコンテナが起動しなかった。
  5. docker-compose exec --user=laradock workspace bash
  6. composer create-project laravel/laravel . --prefer-dist "5.5.*"
  7. root/rootでMySQLに接続してデータベースを作成し、sampleapp/.envにDB接続情報をセットする
    DB_HOST=mysql
    DB_PORT=3306
    DB_DATABASE=データベース名
    DB_USERNAME=root
    DB_PASSWORD=root
  8. http://localhostへアクセス
    ※以降は、laradockディレクトリでdocker-compose up -d nginx mysql workspace、sampleappディレクトリでphp artisan xxxを実行する。

ユーザー認証

ユーザ登録の実装

Laravelインストール時に作成されるRegisterControllerクラスのshowRegistrationFormメソッドとregisterメソッドで行う。
アクションはRegisterUsersトレイトに実装がある。
RegisterControllerでprotected $redirectTo = '/home';となっているため、登録後は/homeにリダイレクトされる。

  1. php artisan migrate
  1. 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');
  1. 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>
  1. 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メソッドをオーバーライドする)

  1. route/web.phpに追加
    Route::get('auth/login', 'Auth\LoginController@showLoginForm');
    Route::post('auth/login', 'Auth\LoginController@login');
    Route::get('auth/logout', 'Auth\LoginController@logout');
  1. 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>

イベント

イベントを使用したメール送信の例

会員登録時にメールを送信するサンプル。

  1. mailhogを起動
    docker-compose up -d mailhog
    http://localhost:8025で受信メールを確認できるようになる。
    ※ ポートが使用済みの場合はdocker-compose.ymlを変更する。
    mailhog:
    build: ./mailhog
    ports:
    – “1026:1025”
    – “8026:8025”
  2. sampleapp/.envのMAIL_HOSTを変更
    MAIL_HOST=mailhog
    MAIL_PORT=1025
  3. イベントとリスナーを登録
    app/Providers/EventServiceProvider.phpの$listen配列にリスナークラスを登録する。
    キーがイベントクラス、値がリスナークラス。

    protected $listen = [
       \Illuminate\Auth\Events\Registered::class => [ \App\Listeners\RegisteredListener::class ],
    ];

    ※ 文字列でもいいが、::classを使う方が一般的。
    ※ デフォルトで登録されている’App\Events\Event’の定義は不要なので削除。
  4. リスナークラスの作成
    php artisan event:generate
    EventServiceProvider.phpに登録してあるイベントクラスとリスナークラスが生成される。
    ※ 今回の場合、app/Listeners/RegisteredListener.phpのみが生成される。

    通常はイベントとリスナーの両方を作成する必要がある。
    ここではイベントはLaravelの認証処理に用意されているクラス(Illuminate\Auth\Event\Registered)を使うため、リスナーのみ作成する。
  5. 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);
        });
    }
}

コメント