RitoLabo

Laravel5.5で自作helper(ヘルパー)ファイルを複数追加できる仕組みを作る

  • 公開:
  • カテゴリ: PHP Laravel
  • タグ: PHP,Laravel,helper,5.5,5.4,5.3,5.x,ServiceProviders,Customize

Laravelに限らずPHPフレームワークにて開発を進めていると、自作のhelper(ヘルパー)関数が必要になった時に、それらをどう管理していくかというのは毎回悩ましいところでもあります。

しかもシステムが大きくなればなるほど自作ヘルパーの数も増えていき、1つのヘルパーファイルに記述しているともう完全に管理ができなくなります。

そこで今回は、機能ごとに複数のヘルパーファイルを作成しても、それを自動的にLaravelがヘルパー関数として読み込んでくれる仕組みを作りたいと思います。

尚、今回のデモンストレーションはLaravel5.5で行いますが、5.4や5.3などの5系でも同様の手順で行えます。

また、ルートディレクトリを「laravel/」とします。

アジェンダ
  1. ディレクトリ作成
  2. サービスプロバイダの生成
  3. 読み込み処理の記述
  4. サービスプロパイダーを登録

ディレクトリ作成

まずは、自作のヘルパー関数を置くディレクトリを作成します。
基本的にはどこでも良いのですが、Laravelのディレクトリ構成から慣習的にappディレクトリ配下が良いと思いますので、ここではMyHelpersという名前のディレクトリをlaravel/app/に作ります。

laravel
├── app
   ├── Console
   ├── Exceptions
   ├── Http
   ├── MyHelpers // ← ココ
   ├── Providers

サービスプロバイダの生成

次に、このMyHelpersディレクトリの中に配置したPHP(ヘルパー)ファイルを読み込む設定を行います。

具体的には、「サービスプロバイダ」という、Laravelの初期起動処理にこの独自ヘルパー群を読み込む処理を追加する形になります。

まずは独自ヘルパー用のサービスプロパイダを作成します。laravelルートディレクトリへ移動し、以下のartisanコマンドを叩きます。

# laravelルートディレクトリへ移動
cd /path/to/laravel

# artisanコマンドでサービスプロパイダファイルを生成する
php artisan make:provider MyHelpersServiceProvider

# 実行結果
[demo@localhost laravel]# php artisan make:provider MyHelpersServiceProvider
Provider created successfully.

生成されたサービスプロパイダファイルは laravel/app/Providers に出力されています。

laravel
├─ app
   ├─ Console
   ├─ Exceptions
   ├─ Http
   ├─ MyHelpers
   ├─ Providers
   │ ├─ MyHelpersServiceProvider.php // ← ココ

読み込み処理の記述

それではこのファイルを開いて、自作ヘルパーを読み込む記述を行っていきます。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class MyHelpersServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}

/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}

↓registerメソッドに以下の記述を追加します。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class MyHelpersServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}

/**
* Register the application services.
*
* @return void
*/
public function register()
{
foreach (glob(sprintf('%s/MyHelpers/*.php', app_path())) as $helper_file){
require_once($helper_file);
}
}
}

説明すると、glob関数でMyHelpersディレクトリ内にあるすべてのPHPファイルを拾い、 それをforeachで回して読み込んでいる。という事になります。

ちなみにこれは最小の書き方を行っているので、わかりやすく分解して書くとしたらこんな感じになります。

// MyHelpersディレクトリ+正規表現で全てのPHPファイルを指定
$preg_path = sprintf('%s/MyHelpers/*.php', app_path());
// glob関数でMyHelpersディレクトリ内のすべてのPHPファイルのフルパスを取得する
$helper_files= glob($preg_path);
// ループさせてMyHelpersディレクトリ内のすべてのPHPファイルを読み込む
foreach ($helper_files as $helper_file){
require_once($helper_file);
}

サービスプロパイダーを登録

最後に、この処理が走るように、サービスプロパイダーを登録します。
config/app.phpのprovidersへ以下を追記します。

'providers' => [


/*
* Helper Original
*/
App\Providers\MyHelperServiceProvider::class,

],

まとめ

これで全ての設定が完了しました。 あとは、MyHelpersディレクトリにPHPファイルを作成し、その中に自作のヘルパー関数を記述していけば、宣言なしで使う事が出来ます。 機能ごとにPHPファイルを分けて独自ヘルパーを書いていけば、関数の数が増えても煩雑にならずスマートに管理していけるので是非試してみてください。