
はじめに
PHP製のWebフレームワークである『Laravel』を使って"認証あり"のアプリケーションを作成していきます。
今回はLaravelバージョン5.3系を使います。
構築
プロジェクトの作成
$ laravel new auth_scaffold $ cd auth_scaffold $ php artisan --version Laravel Framework version 5.3.29
Scaffoldの導入
下記のコマンドで容易に導入することができます。
$ composer require 'laralib/l5scaffold' --dev
サービスプロバイダーの追加
"config/app.php"内の"providers"に対して、「Laralib\L5scaffold\GeneratorsServiceProvider::class
」を追加します。
$ vim config/app.php ーーーーーーーーーーーーーーーーーーーー <?php (省略) 'providers' => [ /* * Laravel Framework Service Providers... */ Illuminate\Auth\AuthServiceProvider::class, Illuminate\Broadcasting\BroadcastServiceProvider::class, (省略) Laralib\L5scaffold\GeneratorsServiceProvider::class, ], (以下省略)
上記の追加が完了したら、Scaffoldの準備完了です。
scaffoldの実行
下記のコマンドで コントローラ・モデル・ビュー の作成が完了します。
相変わらずscaffold便利すぎ!
$ php artisan make:scaffold Tweet --schema="title:string:default('Tweet #1'), body:text" Configuring Tweet... Migration created successfully Seed created successfully. Model created successfully. Controller created successfully. Layout created successfully. Error created successfully. Views created successfully. Dump-autoload... Route::resource("tweets","TweetController"); // Add this line in routes.php
予定通りに作成されたのかを確認してみます。
// コントローラ $ ls app/Http/Controllers/TweetController.php app/Http/Controllers/TweetController.php // モデル $ ls app/Tweet.php app/Tweet.php // ビュー $ ls resources/views/tweets/ create.blade.php edit.blade.php index.blade.php show.blade.php
しっかりと作成されているようです。
相変わらず早い!!
ルーティングの設定
作成されたコントローラを呼び出せないと意味がありませんので、
ルーティングの設定を行っていきます。
"routes/web.php"の末尾に「Route::resource("tweets","TweetController");」を記述します。
$ vim routes/web.php
<?php (省略) Route::get('/', function () { return view('welcome'); }); Route::resource("tweets","TweetController"); // 追記
ルーティングの設定が反映されているか確認してみます。
$ php artisan route:list +--------+-----------+---------------------+----------------+----------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+---------------------+----------------+----------------------------------------------+--------------+ | | GET|HEAD | / | | Closure | web | | | GET|HEAD | api/user | | Closure | api,auth:api | | | POST | tweets | tweets.store | App\Http\Controllers\TweetController@store | web | | | GET|HEAD | tweets | tweets.index | App\Http\Controllers\TweetController@index | web | | | GET|HEAD | tweets/create | tweets.create | App\Http\Controllers\TweetController@create | web | | | DELETE | tweets/{tweet} | tweets.destroy | App\Http\Controllers\TweetController@destroy | web | | | PUT|PATCH | tweets/{tweet} | tweets.update | App\Http\Controllers\TweetController@update | web | | | GET|HEAD | tweets/{tweet} | tweets.show | App\Http\Controllers\TweetController@show | web | | | GET|HEAD | tweets/{tweet}/edit | tweets.edit | App\Http\Controllers\TweetController@edit | web | +--------+-----------+---------------------+----------------+----------------------------------------------+--------------+
データベースの作成
ここの説明は簡単に流します。
データベースの名前は「scaffold_app」にしておきます。
mysql> create database scaffold_app;
データベースの設定は下記のファイルに行います。
- ユーザ名:laravelusr
- パスワード:himitsu
にしています。
$ vim .env
(省略) DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=scaffold_app DB_USERNAME=laravelusr DB_PASSWORD=himitsu (省略)
上記設定が完了したらテーブルの作成を行います。
マイグレーション
下記のコマンドを実行することによって、テーブルが作成されます。
ここでは、tweetsテーブル以外にも作成されていますが、無視しておきます。
$ php artisan migrate Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table Migrated: 2017_01_23_143819_create_tweets_table
Webアプリケーションへアクセス
これで、Webアプリケーションとして利用することが可能になりました。
$ php artisan serve --host 0.0.0.0 --port 3000
"http://127.0.0.1:3000/tweets"にアクセス
上記のような画面が表示されたら成功です。
試しになにか投稿してみましょう。「Create」を押して投稿画面へ遷移できます。
投稿することができました。
「View」を押すことで詳細画面へ遷移することもできます。
これはこれで良いアプリケーションとなっていますが、これから認証機能を実装してきます。
認証機能(Auth)の導入
魔法の呪文『make:auth』
下記のコマンドを実行します。
$ php artisan make:auth
認証に必要な コントローラ・モデル・ビュー の作成が完了します。
Scaffold同様、作成されているかを確認します。
// コントローラ $ ls app/Http/Controllers/Auth/ ForgotPasswordController.php LoginController.php RegisterController.php ResetPasswordController.php // モデル $ ls app/User.php app/User.php // ビュー $ ls resources/views/auth/ login.blade.php passwords/ register.blade.php
作成されているのが確認できます。
次にルーティングの設定ですが、Authの場合は自動的に記述されます。
念のために確認してみます。
$ cat routes/web.php
<?php (省略) Route::get('/', function () { return view('welcome'); }); Route::resource("tweets","TweetController"); Auth::routes(); // 自動的に追加されている Route::get('/home', 'HomeController@index');
ルーティングが反映されているか改めて確認してみます。
$ php artisan route:list +--------+-----------+------------------------+----------------+------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+------------------------+----------------+------------------------------------------------------------------------+--------------+ | | GET|HEAD | / | | Closure | web | | | GET|HEAD | api/user | | Closure | api,auth:api | | | GET|HEAD | home | | App\Http\Controllers\HomeController@index | web,auth | | | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest | | | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest | | | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web | | | POST | password/email | | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web,guest | | | GET|HEAD | password/reset | | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest | | | POST | password/reset | | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest | | | GET|HEAD | password/reset/{token} | | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest | | | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest | | | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest | | | GET|HEAD | tweets | tweets.index | App\Http\Controllers\TweetController@index | web | (省略) | | GET|HEAD | tweets/{tweet}/edit | tweets.edit | App\Http\Controllers\TweetController@edit | web | +--------+-----------+------------------------+----------------+------------------------------------------------------------------------+--------------+
問題なく認証機能へアクセスできそうです。
認証の確認
認証を行っていないユーザはログイン画面へ遷移させるようにしましょう。 $ vim app/Http/Controllers/TweetController.php
<?php namespace App\Http\Controllers; use App\Http\Requests; use App\Http\Controllers\Controller; use App\Tweet; use Illuminate\Http\Request; class TweetController extends Controller { public function __construct(){ $this->middleware('auth'); } (省略)
これで認証を行っていないユーザはTweetControllerのアクションへアクセスできないようになります。
認証後の遷移先を変更
実は認証に必要なアカウントの「登録後」や「認証後」には"/home"へ遷移されるように、Authのコントローラで設定されています。 "/home"には特になにもアプリケーションがありませんので、そこへ遷移されても楽しくありません。
事前に「登録後」や「認証後」には"/tweets"へ遷移されるように設定します。
行う作業は非常に簡単です。
下記2つのファイルを修正するだけです。
$ vim app/Http/Controllers/Auth/RegisterController.php
<?php namespace App\Http\Controllers\Auth; use App\User; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Validator; use Illuminate\Foundation\Auth\RegistersUsers; class RegisterController extends Controller { (省略) protected $redirectTo = '/tweets'; // "home" を "tweets" に変更 (省略)
$ vim app/Http/Controllers/Auth/LoginController.php
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; class LoginController extends Controller { (省略) protected $redirectTo = '/tweets'; // "home" を "tweets" に変更 (省略)
これで完成です。
アプリケーションを確認
下記のコマンドでアプリケーションを起動しましょう。
$ php artisan serve --host 0.0.0.0 --port 3000
「http://127.0.0.1:3000/」にアクセスすると下記のような画面が表示されます。
ためしに「http://127.0.0.1:3000/tweets」に直接アクセスしてみましょう。
当然ながら認証を行っていませんので、ログイン画面へ遷移されます
まだ、ユーザは存在していないので「Register」からユーザの作成を行ってみます。
ユーザの作成が完了すると、認証処理が行われTweets画面へ遷移されます。
こんな短時間でこのようなアプリケーションが作成できるとは驚きです。
今回は誰でもがアカウントを作成することができ、認証後のページにアクセスすることが可能となっていますが、コードをいじってみることで自分だけがアクセスできるサイトを作れそうですね。