綺麗に死ぬITエンジニア

Laravel 5へ自作のヘルパー関数を追加するベストプラクティス

2017-02-07

Laravelには、ヘルパー関数(Helper Functions)という、便利なグローバル関数が複数定義されています。

このヘルパー関数の多くはフレームワーク自体で使用されていますが、ユーザーがアプリケーションに含むこともでき、自由に使用できます。

しかし実際には、標準のヘルパー関数だけではなく、自分で独自のヘルパー関数を自作・追加し、各ファイルから呼び出したい場合もあるでしょう。しかしながら、Laravel公式には、自作のヘルパー関数を追加する方法は用意されていません。

そこで、Laravelへ自作のヘルパー関数を追加する、最適な方法についていくつか例を挙げて検討してみます。

独自のヘルパー関数を実装したい方は、以下を参考に、自分のプロジェクトに最適な方法で導入してみてください。

Composerでオートロードする方法

独自のヘルパー関数を定義した、以下のようなapp/helpers.phpファイルを作成します。

...
if (! function_exists('xxx')) {
    /**
     * XXXする関数
     *
     * @param string $value
     * @return string
     */
    function xxx($value)
    {
        // 処理
        return $value;
    }
}
...

composer.jsonautoload.filesへ以下のようにパスを追加します。

"autoload": {
    "classmap": [
        ...
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/helpers.php" // 追加
    ]
},

その後、以下のComposerコマンドを実行します。

composer dump-autoload

以上で終了です。各場所から自作のヘルパー関数が読み込めるようになっているかと思います。

何より簡単に導入でき、既存のLaravelの構成への影響が最も少ないのが、この方法の利点と考えます。

ヘルパー関数を読み込むサービスプロバイダを定義する方法

複数ファイルを読みたい場合や、細かい制御を行いたい場合はサービスプロバイダを用いてLaravelらしく実装するのも一つです。

まず、appディレクトリにHelpersディレクトリを作成します。そして、Helpersディレクトリへ、独自のヘルパー関数を定義したPHPファイルを追加していきます。

次に、以下のようにartisanコマンドを実行してHelperServiceProvider.phpを作成します。

php artisan make:provider HelperServiceProvider

作成したHelperServiceProviderregisterメソッドを以下のようにします。

public function register()
{
    foreach (glob(app_path().'/Helpers/*.php') as $filename){
        require_once($filename);
    }
}

最後に、config/app.phpproviders配列へクラスを追加し、サービスプロバイダの登録をします。

'providers' => [
    ...
    App\Providers\HelperServiceProvider::class,
    ...
],

ヘルパー関数を読み込むサービスプロバイダを機能ごとに用意するようにしたり、ルーティングで利用するサービスプロバイダを振り分けたりすることで、無駄なくヘルパー関数を利用できるようになる点が、この方法の強みです。

静的なヘルパークラスを定義する方法

厳密にはヘルパー関数ではなくなりますが、問題解決の方法としては、スタティックなメソッドを持つクラスを用意して、ヘルパー関数の代替とすることもできます。

例えば、app\Helpers\Helper.phpとして以下のファイルを作成します。

<?php

namespace App\Helpers;

class Helper
{
    /**
     * XXXする関数
     *
     * @param string $value
     * @return string
     */
    public static function xxx($value)
    {
        // 処理
        return $value;
    }
}

config/app.phpalias配列へクラスを追加し、エイリアスの登録をします。

'alias' => [
    ...
    'Helper' => App\Helpers\Helper::class,
    ...
],

以上で完了です。ビュー(Blade)やコントローラーから、上記の静的メソッドを持ったクラスを呼び出して使用します。

<p>{{ Helper::xxx('Hello world!!') }}</p>
<?php

namespace App\Http\Controllers;

use Helper;

class ExampleController extends Controller
{
    public function index()
    {
        $value = Helper::xxx('Hello world!!');
    }
}

この方法は、機能ごとにクラスを用意できるので、1機能ごとに複雑に様々な関数を用意したい場合には、ヘルパー関数を用意する方法よりも有用だと思います。また、何より、ディレクトリ設計を綺麗なまま保つことができますので、綺麗な設計を心がけたい場合にも、この方法は良い方法だと思います。

まとめ

Laravel 5へ自作のヘルパー関数を追加する方法を、複数紹介してみました。

最適な方法はプロジェクトの設計思想によって異なると思いますので、この記事を参考に、各々最適だと思われる方法で導入していただけると幸いです。

筆者について

フリーランスエンジニアとして活動している、「もりやませーた」です。

筆者のTwitterはこちら。記事に関するご意見等はTwitterの方へお寄せください。

その他業務に関するお問い合わせは、こちらのページをご覧ください。

PHP Laravel