web-dev-qa-db-ja.com

Laravel 5.4のカスタムヘルパークラス

_app/Helpers_にいくつかのヘルパークラスがあります。 _service provider_を使用してこれらのクラスをロードし、ブレードテンプレートで使用するにはどうすればよいですか?

例えばメソッドfooBar()を含むクラスCustomHelperがある場合:

_<?php

nampespace App\Helpers;

class CustomHelper
{
    static function fooBar()
    {
        return 'it works!';
    }
}
_

ブレードテンプレートで次のようなことができるようにしたいと思います。

_{{ fooBar() }}
_

これを行う代わりに:

_{{ \App\Helpers\CustomHelper::fooBar() }}
_

PS:@ andrew-brownの answer in Laravelのカスタムヘルパーのベストプラクティス5 非クラスファイルを扱います。クラス間でヘルパー関数を整理できるように、クラスベースのソリューションを用意するのは良いことです。

14
byteseeker

クラスにコードがある場合、関数のみを使用することは不可能だと思います。まあ、あなたはブレードを拡張することで試すことができますが、それは多すぎます。

あなたがすべきことは、たとえばapp\Helpers\helpers.phpおよびcomposer.jsonファイルに次のように入力します。

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": ["app/Helpers/helpers.php"] // <- this line was added
},

作成app/Helpers/helpers.phpファイルして実行

composer dump-autoload

app/Helpers/helpers.phpファイルでは、次のようなカスタム関数を追加できます。

if (! function_exists('fooBar')) {
   function fooBar() 
   {
      return \App\Helpers\CustomHelper::fooBar();
   }
}

そのため、グローバル関数を定義しますが、実際にはそれらのすべてがいくつかのクラスの特定のパブリックメソッドを使用する場合があります。

ちなみに、これはLaravelが独自のヘルパーに対して行うこととまったく同じです:

if (! function_exists('array_add')) {
    function array_add($array, $key, $value)
    {
        return Arr::add($array, $key, $value);
    }
}

ご覧の通りarray_addは、より短い(またはより冗長な)書き込み方法ですArr::add

32