2021年4月13日火曜日

PHP:Laravel-06

今回は参照としているのは、
参考にしているもの

学習のポイントはエラーの出し方やログイン情報です。

DB内のテーブル情報を作り直す便利なコマンドは

>php artisan migrate:fresh

項目などを追加したり、削除するにも便利です

1.インストール

composer create-project laravel/laravel プロジェクト名

cd プロジェクト名

php artisan serve

これでローカルでWeb画面が開けばインストール完了

2.Laravel8 (laravel/ui)でのLogin機能の実装用

>php artisan ui bootstrap --auth

3.フロントエンドパッケージインストール

laravel/uiのvueベースをインストールした際に、必要なフロントエンドパッケージがpackage.jsonに追記されました。

bootstrap、jqueryなどが追記されています。

これらのパッケージをインストールします。

>npm install

4.フロントエンドビルド実行

必要なパッケージは全てインストール完了したので、最後にフロントエンドソースコードをビルドしてみます。

これは毎回必要です

>npm run dev

このコマンドを実行することで、Laravel Mixのビルド処理が実行され、コンパイルされたjs、cssが/public/js public/cssに出力されます。

日本語の処理は参考としているURLをご覧ください。

5.ログイン状態の取得

Auth クラスの check メソッドでログインしているかどうかを確認することができます 。
アクセスしたユーザーがログインしていれば Auth::check() は true を返し、ログインしていなければ false を返します。

テンプレートではこの Auth::check() を利用してログインしていた場合の要素とログインしていない場合の要素を出し分けています。

@if(Auth::check())

  <!-- ログインしていた場合 -->

@else

  <!-- ログインしていない場合 -->

@endif

Auth::check() とは逆の働きをする guest メソッドも存在します。つまり Auth::guest() はユーザーがログインしていない場合に true を返します。


ログインユーザーの取得

Auth::user() でログイン中のユーザーを取得できます。返却値はログインユーザーの情報が入った User モデルのインスタンスです。


Auth::check() や Auth::user() はコントローラーなどでも使用することができます。実際に後述の処理でも使用します。便利なメソッドですので覚えておきましょう。


ログアウト

次にログアウト処理を実装します。

@if(Auth::check())

  <script>

    document.getElementById('logout').addEventListener('click', function(event) {

      event.preventDefault();

      document.getElementById('logout-form').submit();

    });

  </script>

@endif

6.ページに認証を求める

アプリケーションの利用にログイン認証を求める機能を実装します。
ログインしないとフォルダやタスクの作成・閲覧ページにアクセスできないようにします。

ページに認証を求める処理はミドルウェアを用いて実現します。ミドルウェアとは、ルートごとの処理に移る前に実行されるプログラムでした。認証状態の確認はさまざまなルートに共通して実行したい処理なのでミドルウェアで実現するのに適しています。

認証を求めるミドルウェアはデフォルトで用意されていますので、routes/web.php でルートにミドルウェアを適用します。

Route::group(['middleware' => 'auth'], function() {
    # ホームページ機能
    Route::get('/'
        'App\Http\Controllers\HomeController@index')->name('home');

    # フォルダ作成機能
    Route::get('/folders/create'
        'App\Http\Controllers\FolderController@showCreateForm')
            ->name('folders.create');
    Route::post('/folders/create'
        'App\Http\Controllers\FolderController@create');

    Route::group(['middleware' => 'can:view,folder'], function() {
        # タスクリスト機能
        Route::get('/folders/{folder}/tasks'
            'App\Http\Controllers\TaskController@index')->name('tasks.index');      

ミドルウェアは 'auth' という名前で指定されていますが、app/Http/Kernel.php というファイルに実際のクラスと名前の定義があります。

protected $routeMiddleware = [

    'auth' => \App\Http\Middleware\Authenticate::class,

    // ...

];

このミドルウェアはアクセスしたユーザーの認証状態をチェックして、ログインしていたらそのままコントローラーメソッド(または次のミドルウェア)に処理を渡します。ログインしていなければログイン画面にリダイレクトさせます。

7.ログイン前のみ閲覧できるページ

認証「されていない」ことを確かめるミドルウェアを編集します。

ログインページや会員登録ページはログインしていないときにだけアクセスできるべきですね。すでにログインしているユーザーがそのようなページにアクセスすることを防ぐミドルウェアは用意されていますが、一部編集する必要があります。

app/Http/Middleware/RedirectIfAuthenticated.php 

public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/');
        }

        return $next($request);
    }

RedirectIfAuthenticated ミドルウェアは会員登録コントローラーやログインコントローラーのコンストラクタで適用されています。

RegisterController.php

public function __construct()

{

    $this->middleware('guest');

}

LoginController.php

public function __construct()

{

    $this->middleware('guest')->except('logout');

}

'guest' という名前は Kernel.php で定義されています。

Kernel.php

protected $routeMiddleware = [

    // ...

    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,

    // ...

];

参考にすべき情報があると、知っているだけで知識と知恵が備わります。
今回学習すべき点はルーティングやログインに関してです。
エラーの出し方がわかると、次にVUEと合体させて学習し、実務に活かしましょう。