WEB/システム/IT技術ブログ

Laravelのシーディング機能を使ってデータを移行します。

現在、とある別フレームワークで構築した旧システムをから、Laravelを利用したシステムへと移行しています。
DBのデータを移行する必要があり、バッチ処理を実装しなければいけないと考えていたのですが、Laravelにはシーディングという便利な機能があるみたいなので、早速トライします。

シーダーファイル作成

シーディングでは、まず処理を記述したシーダーファイルを用意します。
シーターファイルはartisanコマンドで作成することができます。例えば、ユーザ情報を移行する処理「UsersTableSeeder」を作成します。

> php artisan make:seeder UsersTableSeeder

コマンドを実行するとファイル「/database/seeds/UsersTableSeeder.php」が作成されます。内容は以下のとおりです。

use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
	public function run()
	{
		//
	}
}

関数「run」の中に、データ移行に必要な処理を記述します。
今回の場合は、旧システムのDBからユーザ情報を取り出し、LaravelのDBにInsertするような処理を実装しますが、その詳細は割愛します。

Laravelのバリデーションで、半角英数字をチェックするルールが用意されているのですが、日本語など全角文字には対応していないようです。

例えば、ユーザ名などに対して半角英数字「a~z」「A~Z」「0~9」を許可したいときは、以下のように「alpha_num」を追加すればチェックしてくれます。

  return Validator::make($data, [
    'name' => ['required', 'string', 'alpha_dash', 'max:255'],
  }

但し、このルールでは日本語を含む全角文字をチェックせずにスルーしてしまいます。
オープンソースあるあるですよね。日本語に標準を合わせてパッケージ開発されてないので、当然といえば当然です。
そこで今回は、全角文字をチェックするルールを追加してみます。

Laravelではコマンド1つでユーザ認証に関連したプログラムファイルやDBを生成してくれるので、とても便利です。
今回はその機能をカスタマイズして、ユーザ情報を保存するusersテーブルのカラムを追加してみたいと思います。

usersテーブルにカラムを追加する

usersテーブルに、例えばカラム「電話番号」「住所」を追加します。
カラムを追加するために、以下のコマンドでマイグレーションファイルを作成します。

> php artisan make:migration add_column_to_users_table

ファイル「database/migrations/2020_xx_xx_xxxxxx_add_column_to_users_table.php」が生成されます。
以下のように、電話番号と住所を追加する処理を追記します。

  public function up()
  {
    Schema::table('users', function (Blueprint $table) {
      $table->string('phone');  // 電話番号
      $table->string('address');  // 住所
      $table->softDeletes();  // ソフトデリート
    });
  }

  public function down()
  {
    Schema::table('users', function (Blueprint $table) {
      $table->dropColumn('phone');  // 電話番号
      $table->dropColumn('address');  // 住所
      $table->dropSoftDeletes();  // ソフトデリート
    });
  }

ファイルを保存したら、マイグレーションを実行します。

> php artisan migrate

DBのusersテーブルを確認すると、カラム「phone」と「address」が追加されてるのが確認できます。

Laravel 5.xで用意されている認証機能は便利です。
ただデフォルトのまま使うと、本人認証なしで簡単に新規ユーザを作成できてしまいます。
具体的には新規登録画面で「ユーザ名」「メールアドレス」「パスワード」「確認用メールアドレス」を入力するだけで新規ユーザ登録が完了してしまいます。
このままだと、例えばロボットなどに大量に架空ユーザを登録されるなど懸念されます。

最近では、新規登録画面で必要情報を入力した後に、入力したメールアドレス宛に本人確認用のURLを送信して、ユーザ登録を完了するフローが主流です。
Laravelにもこのメールアドレス確認機能(Email Verification)が用意されてるようなので、早速試してみます。

認証機能を準備

はじめに準備として、以下のコマンドを実行すると、認証に必要なルートやビューを生成してくれます。
既に実行済みの場合は、こちらをスキップしてもらって構いません。

> php artisan make:auth

Laravel初心者の私ですが、テンプレートの共通部分に毎回同じ処理済みの値を渡したいケースがあり、その場合に全てのコントローラに同じ処理を書くのはイケてないなぁと考えてました。
例えば、設定ファイルやDBの値を取得、加工して、ヘッダのグロナビにデータを渡したい場合など、全画面で必要とする処理を共通化したかったのです。
調べてみたら、サービスプロバイダとビューコンポーザというしくを使えば目的を達成できそうなので、早速試してみました。

サービスプロバイダを作成する

まずはサービスプロバイダを作成します。サービスプロバイダは、任意のビューに対してコントローラとは別に一定の値を渡すことができます。
作成にはartisanコマンドで作成することができます。例えば共通ヘッダにセットする値を処理するHeaderServiceProviderを作成する場合、以下のコマンドで作成できます。

> php artisan make:provider HeaderServiceProvider

そうすると「/app/Providers/HeaderServiceProvider.php」ファイルが生成されます。中味は以下のとおりです。

namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class HeaderServiceProvider extends ServiceProvider
{
  public function register()
  {
  }

  public function boot()
  {
  }
}

Laravel 5.8で問い合わせフォームなどからメールを送信しようと思い、STMPの設定をしたのですがメール送信エラーになってしまいました。

Laravelでメールを送信するための設定は「.env」に記述します。以下、デフォルトの設定項目です。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

今回、xserverのSMTP(SSL)を使ってメールを送信しようと思い、以下のように設定しました。

MAIL_DRIVER=smtp
MAIL_HOST=xxxxx.xserver.jp
MAIL_PORT=465
MAIL_USERNAME=xxxxx@helog.jp
MAIL_PASSWORD=xxxxxxxx
MAIL_ENCRYPTION=ssl

メールを送信プログラムを実行すると、以下のエラーメッセージが表示され、メール送信に失敗します。

Expected response code 354 but got code "554", with message "554 5.5.1 Error: no valid recipients "

Laravelでミドルウェアを使ってみます。

フレームワークを設計する際に、度々、共通処理をどこに設置するのかということで悩みます。
先日もLaravel初心者の私がLaravelを設計しているときに、全ページで共通の処理を実行したいのだけどどうしよう?と調べていたらミドルウェアの情報にたどり着きました。
基本的にLaravelはMVCアーキテクチャを採用しているのですが、各リスエストを処理するコントローラとは別に、ミドルウェアというプログラムを用意して任意のリクエストに対して同じ処理を実行するしくみが用意されてるようです。

例えば、

  • 任意のチェック処理を一部リクエストに対して実行したい場合
  • 全ページに対して任意のデータを埋め込みたい場合

など、ミドルウェアとしてプログラムを用意して、好きなところに組み込むことができます。

ミドルウェアの新規作成

まずはミドルウェアを新規作成します。
ミドルウェアの作成は、自身でクラスファイルを用意してコードを記述してもよいですが、Laravelでは以下の便利なコマンドが用意されています。

> php artisan make:middleware SampleMiddleware

コマンドを実行すると、自動で以下のファイルが生成されます。

/app/Http/Middleware/SampleMiddleware.php

ファイルの中味は以下の通りです。

namespace App\Http\Middleware;
use Closure;
class SampleMiddleware
{
  public function handle($request, Closure $next)
  {
    return $next($request);
  }
}

今回内容解説については割愛しますが、このファイルをベースにプログラムを開発します。

最近、Laravel、FuelPHPやCakePHPなどパッケージをComposerで管理するのが当たり前になりました。
ところが、レンタルサーバxserverでComposerで実行するとエラーが発生しました。

$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - This package requires php ^7.1.3 but your HHVM version does not satisfy that requirement.
  Problem 2
    - beyondcode/laravel-dump-server 1.2.2 requires php ^7.1 -> your PHP version (5.4.16) does not satisfy that requirement.
    - beyondcode/laravel-dump-server 1.2.2 requires php ^7.1 -> your PHP version (5.4.16) does not satisfy that requirement.
    - Installation request for beyondcode/laravel-dump-server 1.2.2 -> satisfiable by beyondcode/laravel-dump-server[1.2.2].

コマンド実行にはPHP 7.1.3以上が必要だが、それを満たしてないというエラーのようです。
現在のバージョンを調べてみると確かにPHP 5.4.16です。

$ php -v
PHP 5.4.16 (cli) (built: Oct 30 2018 19:30:51)
Copyright (c) 1997-2013 The PHP Group

最近注目のlaravelはちょくちょく触っていますが、今回、本格的に習得してみようかと思い、改めてインストール方法から確認します。
Laravel – ウェブ職人のためのPHPフレームワーク

対象の環境は以下の通りです。

  • Windows 10 Home
  • Laravel 5.8
  • PHP 7.1.3

Laravel 5.8の動作環境としてPHP 7.1.3以上が必要です。

Laravelのインストール

LaravelのインストールにはComposerを使用します。
コマンドプロンプトを起動して、Composerを利用してLaravelインストーラをダウンロードします。

> composer global require laravel/installer

Composerのbinディレクトリにパスが設定されてることを前提に、例えば、sampleフォルダにLaravelをインストールするには以下のコマンドを実行します。

> laravel new sample

また、Composerでバージョンを指定してインストールすることもできます。

> composer create-project --prefer-dist laravel/laravel sample "5.8.*"

突然、ある日からWindows 10を起動すると「Microsoft Teams」なるものが起動してログインを要求するようになりました。
そんなものをインストールした覚えもないので、ウイルスに感染したのかと心配になりましたが、どうやらMicrosoft公式のアプリのようです。

何なのか分からないし、恐らく不要なのでアンインストールします。
アンインストールメニューから「Microsoft Teams」を選択し、アンインストールします。

Monthly Archives