九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さて、Laravel5.6がリリースされて少し経ちました。
運がいいことに、あるクライアント様から最新環境でウェブサイトを構築したいとのご依頼をいただいたため、まさに今Laravel5.6を使って開発が進行しています。
個人的にLaravelは4.2から利用してるんですけど、そこから考えると内容が様々に進化して過去バージョンとは違いが出てきています。
そこで!
今回は最新バージョンのLaravel5.6をインストールした後すぐにやるべきことをまとめてみました。
ゴールとしては、
- 基本的な設定(DB、タイムゾーン、言語など)
- ユーザー認証(ログイン、パスワードリマインダーが使える、テストユーザーも追加)
- 日本語化
の3つです。
では、早速みていきましょう!
目次
基本的な設定
1.データベース
mysqlなどに好きな名前のデータベースを作成してください。
※照合順序など詳細な設定をしたい場合はconfig/database.php内で設定できます。
2..env
インストールフォルダ直下にある「.env」の中では色々と設定できますけど、基本的なものだけを紹介します。
- APP_NAME ・・・ サイト名
- APP_URL ・・・ サイトのURL
- DB_DATABASE ・・・ 1.で作成したデータベース名
- DB_USERNAME ・・・ データベースのユーザー名
- DB_PASSWORD ・・・ データベースのパスワード
もしメールサーバーが稼働してるのなら、「MAIL_DRIVER」を「sendmail」などに変更すれば、メール送信ができると思います。
※ 上記の文章は、もともとは「mail」としていましたが、現在はsendmail
となっちるため変更しました。
ちなみに私の場合はmailcatcherを使ってるんで、こんな感じです。
MAIL_DRIVER=smtp MAIL_HOST=127.0.0.1 MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null
3.app.phpの設定
config/app.phpでは、3カ所です。
- timezone ・・・ タイムゾーン。UTCからAsia/Tokyoに変更
- locale ・・・ 言語。enをjaに変更
- fallback_locale ・・・
上と同じ。ここは該当言語が見つからない場合の言語です。「en」がいいでしょう。
4.権限の変更
以下の2フォルダは権限が「777」になっている必要があります。
- /storage
- /bootstrap/cache
以下のようなコマンドを使って権限を変更しましょう。
sudo chmod 777 storage -R
sudo chmod 777 bootstrap/cache -R
さぁ、以上で基本的な設定は終了です。
ログイン、パスワードリマインダー機能を構築
【注意】Laravel 6.0以降はログイン機能が別パッケージで管理されるようになったため手順が違います。詳しくは、こちらのページを参照してください。
もし、ログインできるようにしたい場合は以下のコマンド2発で作成が完了します。(ただし日本語化する必要あり。後で説明します)
php artisan make:auth
php artisan migrate
はい、これでデータベースにはusersなどの認証に必要なテーブルが作成されています。
ただ、まだユーザーは登録されていないので、seederを作って、データベースがリフレッシュされても、テストユーザーが自動で登録されるようにしておきましょう。
まずはコマンドでseederの雛形を作成します。
php artisan make:seed UsersTableSeeder
/database/seeds/UsersTableSeeder.phpが作成されるので、このファイルを開いて以下のように変更。
<?php use Illuminate\Database\Seeder; class UsersTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { \App\User::create([ 'name' => '山田太朗', 'email' => 'taro@example.com', 'password' => bcrypt('YOUR-PASSWORD') ]); } }
※bcryptの部分では暗号化をしています。つまり、データベースの中身は暗号化されているので、万が一データが流出しても、この情報だけではログインできないというわけですね。逆に言うとここでbcryptで暗号化していないと、きちんとログインできなくなってしまいます。
そして、このSeederを有効にするために/database/seeds/DatabaseSeeder.phpの中で以下のように設定します。(デフォルトでUsersTableSeederは記述されているので、コメントアウトを外すだけです)
public function run() { $this->call(UsersTableSeeder::class); }
さぁ、これで完了です。以下のコマンドでユーザーを登録してみましょう。
php artisan migrate:fresh --seed
※実際にはseederだけのコマンドがありますけど、これならDBを初期化 + テストユーザー追加までやってくれるんで、こっちの方が便利だと思います。
さぁ、これでユーザーが追加されたので、http://YOUR-DOMAIN/loginからログインしてみましょう!
追記:2018/11/28
Laravel 5.7.14のアップデートで、以下のようにパスワードリマインダー機能だけ無効にすることができるようになりました。
// routes/web.php Auth::routes(['reset' => false]);
日本語化
ただし、このままだと英語のままになってるので、以下3カ所を変更して日本語化しましょう。
- フォーム ・・・ ログインやパスワードリマインダーのHTML
- バリデーション ・・・ エラー文章
- メール文面 ・・・ パスワード再発行のメール文面
これもひとつひとつ見ていきましょう。
1.フォームのビュー
/resources/views/auth以下の4ファイルです。
- login.blade.php
- register.blade.php
- passwords/email.blade.php
- passwords/reset.blade.php
翻訳すべき内容は、以下になります。
- Login → ログイン
- Password → パスワード
- Confirm Password → パスワード(確認)
- Name → ユーザー名
- Register → ユーザー登録
- E-Mail Address → メールアドレス
- Forgot Your Password? → パスワードを忘れましたか?
- Reset Password → パスワード再発行
- Send Password Reset Link → パスワード再発行URLを送信
(できたら、そろそろこの辺もLaravelの方で自動的に言語変更してほしいですねー。)
2.バリデーション
Laravel-langというGitHubパッケージが、世界各国の翻訳データを公開しています。日本語のフォルダはこちら。
用意されているファイルは4つです。
- auth.php
- pagination.php
- passwords.php
- validation.php
/resources/lang/jaというフォルダを作成し、これらのファイルを設置すれば完了です。
ただし、実はこれだけでは不十分で、エラー文章が
emailは、必ず指定してください。
とか、
passwordは、必ず指定してください。
という具合に、inputタグのnameが表示されてしまいます。
これを改善するために、/resources/lang/ja/validation.phpの中にある、attributesを以下のように変更しましょう。
'attributes' => [ 'email' => 'メールアドレス', 'password' => 'パスワード', 'password_confirmation' => 'パスワード(確認)', 'name' => 'ユーザー名' ],
これで、バリデーションの日本語化も完了です。
3.メール文面
パスワード再発行の手続きをする場合、再発行URLを送信するんですが、このメール内容がバリバリの英語なので、これも変更します。
(ここはちょっと複雑です)
まず、ResetPasswordNotificationという専用のNotificationを作成します。
これもコマンドを使ってやりましょう。
php artisan make:notification ResetPasswordNotification
作成したら、app/Notifications/ResetPasswordNotification.phpを開いて以下のように変更します。
<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; class ResetPasswordNotification extends Notification { use Queueable; /** * Create a new notification instance. * * @return void */ public function __construct($token) { $this->token = $token; } /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Get the mail representation of the notification. * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->from('admin@example.com', config('app.name')) ->subject('パスワード再発行') ->line('パスワード再発行リクエストがありましたので、メッセージ送信しました。') ->action('パスワード再設定', url(config('app.url').route('password.reset', $this->token, false))) ->line('もし心当たりがない場合は、本メッセージは破棄してください。'); } /** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ // ]; } }
ここで重要なのは、__construct()内の、$tokenです。
これは、再発行メッセージを送信する際にトークンを受け取って、そのトークンを含んだURLを作成する必要があるからです。
実際の使い方は、以下のようになります。
app/User.phpにsendPasswordResetNotification()を追加してください。(オーバーライド)
<?php namespace App; use App\Notifications\ResetPasswordNotification; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Notifiable; /* (省略) */ public function sendPasswordResetNotification($token) { $this->notify(new ResetPasswordNotification($token)); } }
さぁ、これで完成!
・・・と言いたいところですが、これだけではまだ不十分で、おそらく以下のようなメール文面になってるかと思います。
実はNofiticationもViewのようにレイアウトが設定されていて、これを変更しないといつまでも「Hello!」というフランクな(笑)あいさつ文が送信されてしまいます。
なので、次はNotificationのレイアウトを変更しましょう。
以下のコマンドで、publishします。
php artisan vendor:publish
すると、いくつかリストが表示されると思うので、
laravel-notifications
と書かれた番号を入力してエンターキーを押しましょう(僕の環境では6番でした。)
/resources/views/vendor/notifications/notifications.blade.phpが作成されるのでこのファイル内の
- Hello!
- Regards,
- If you’re having trouble clicking the….
の3カ所を以下のように日本語に変更します。
@component('mail::message') {{-- Greeting --}} @if (! empty($greeting)) # {{ $greeting }} @else @if ($level == 'error') # Whoops! @else # こんにちは。 @endif @endif {{-- Intro Lines --}} @foreach ($introLines as $line) {{ $line }} @endforeach {{-- Action Button --}} @isset($actionText) <?php switch ($level) { case 'success': $color = 'green'; break; case 'error': $color = 'red'; break; default: $color = 'blue'; } ?> @component('mail::button', ['url' => $actionUrl, 'color' => $color]) {{ $actionText }} @endcomponent @endisset {{-- Outro Lines --}} @foreach ($outroLines as $line) {{ $line }} @endforeach {{-- Salutation --}} @if (! empty($salutation)) {{ $salutation }} @else {{ config('app.name') }} より @endif {{-- Subcopy --}} @isset($actionText) @component('mail::subcopy') もし、「{{ $actionText }}ボタン」がうまく機能しない場合、以下のURLをコピー&ペーストして直接ブラウザからアクセスしてください。 [{{ $actionUrl }}]({{ $actionUrl }}) @endcomponent @endisset @endcomponent
※bladeの中身を見ると、$greetingが存在していれば、そちらが適用されますので、「おはようございます」や「こんばんは」など時間で変更することも可能ですね。
※あとは、よくあるサイト名はリンクなど、メール・フッターをつくることもできますので、いろいろと試してみて下さい。
さぁ、これで以下のようなメールが受信できたはずです。
以上で、全て終了です。
お疲れ様でした。
おわりに
Laravel Loverとしては、いろんな機能がどんどん追加されて嬉しいんですけど、今から学習しないといけないプログラマーさんは結構大変なのかなー、なんて思ったりもします。(若手の方は、もはやPHPじゃなくてnodeとかの別言語かもですけどねー^^;)
ではでは〜!