Laravel 5のカスタムヘルパーのベストプラクティス[終了]


472

Laravel 5のビュー間でコードが繰り返されないように、ヘルパー関数を作成したいと思います。

view.blade.php

<p>Foo Formated text: {{ fooFormatText($text) }}</p>

それらは基本的にテキストフォーマット関数です。これらの機能を備えたファイルをどこでどのように作成できますか?

回答:


595

helpers.phpappフォルダーにファイルを作成し、composerでロードします。

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

これをcomposer.jsonファイルに追加したら、次のコマンドを実行します。

composer dump-autoload

(PSR-4名前空間クラスファイルではないため)ディレクトリにhelpers.phpファイルを保持したくない場合はapplaravel.comWebサイトの機能を実行できます。helpers.php ブートストラップディレクトリにを保存します。composer.jsonファイルに必ず設定してください。

"files": [
    "bootstrap/helpers.php"
]

86
noobsのヒント:composer.jsonを変更した後でこのコマンドを使用します。composer dump-autoload
Allfarid MoralesGarcíaJun

11
@AllfaridMoralesGarcíaまたは、単に「便利なヒントです。回答では後でこれを行う必要があることが明確にされていないため」。
マットマクドナルド

8
ビューを簡単に作成できるようにするヘルパー関数を承認しますが、この回答が他の回答でどれだけ参照されるかは嫌です。私を誤解しないでください。それは良い答えであり、正しいです。人々がそれを乱用し、不適切に書かれた、適切に構成されていない関数型PHPを再び書き始めるのを恐れています。
andrewtweber 2015年

40
私はこのアプローチを理解していません。Composerは、ライブラリを含めるためのツールであると想定されています。Laravelはライブラリなしで完全に機能し、ComposerはLaravelなしで機能します。この提案は、アプリ内にファイルを作成し、アプリを離れ、Composerに移動し、アプリに戻ってファイルを含めるようにcomposerに指示するように指示します。Laravelはファイルのインクルードを明確に処理しますよね?Laravelのネイティブ実装を忘れて、この外部ツールを使用してファイルを含め、アプリケーションをComposerにさらに結合するのはなぜでしょうか?怠惰ですか、それとも何か不足していますか?
dKen

6
Laravelはcomposerのオートローダーを使用して、依存するすべてのライブラリとファイルをどこに含めるかを認識します。これは、bootstrap / autoload.phpで参照されます。そのファイルのコメントを読みます。アプローチは、ファイルへの参照をcomposer.jsonに追加してから、「autoloadをダンプ」して、Laravelがそれを見つけられるようにcomposerのオートローダーを再生成します。Composerの「ファイル」コレクションを使用すると、Composerパッケージに適切にまとめられていないライブラリまたは1回限りの関数ファイルを追加できます。「この1つの奇妙なファイルを含める必要がある」という状況すべてに対応できる場所があると便利です。
Phillip Harrington、

370

Laravel 5のカスタムクラス、簡単な方法

この回答は、Laravel内の一般的なカスタムクラスに適用されます。ブレード固有の回答については、Laravel 5のカスタムブレードディレクティブを参照してください。

ステップ1:ヘルパー(または他のカスタムクラス)ファイルを作成し、それに一致する名前空間を付けます。クラスとメソッドを記述します。

<?php // Code within app\Helpers\Helper.php

namespace App\Helpers;

class Helper
{
    public static function shout(string $string)
    {
        return strtoupper($string);
    }
}

ステップ2:エイリアスを作成します。

<?php // Code within config/app.php

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

ステップ3:composer dump-autoloadプロジェクトルートで実行する

ステップ4: Bladeテンプレートで使用する:

<!-- Code within resources/views/template.blade.php -->

{!! Helper::shout('this is how to use autoloading correctly!!') !!}

追加クレジット:このクラスはLaravelアプリのどこでも使用できます。

<?php // Code within app/Http/Controllers/SomeController.php

namespace App\Http\Controllers;

use Helper;

class SomeController extends Controller
{

    public function __construct()
    {
        Helper::shout('now i\'m using my helper class in a controller!!');
    }
    ...

出典:http : //www.php-fig.org/psr/psr-4/

機能する理由:https : //github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php

自動読み込みの開始場所:http : //php.net/manual/en/language.oop5.autoload.php


35
明確にするために、この答えは実際にはグローバル名前空間関数であるヘルパーを扱っていません。代わりに、ヘルパーをクラスメソッドに変換することを推奨します。これは一般的に最良のアプローチですが、実際にここで尋ねられた質問には答えません。そのため、他の答えは比較すると非常に複雑です。
Dan Hunsaker、2015年

1
関数ヘルパーとは、ブレードでも使用できることを意味します。この関数をブレードで使用できるようにするにはどうすればよいですか?ブレードでHelper :: prettyJason(parameters)を呼び出すことはできません。
MaXi32

@ MaXi32では、aliases配列の下にクラスを追加 できますapp/config.php'Helper' => App\Helpers\Helper::class,その後Helper::prettyJson();、ブレードを正常に呼び出すことができます。
ハイジアン2016

@DanHunsakerは質問に直接回答するように編集しましたが、それでも同じ単純なアプローチです。また、単に独自のカスタムブレードディレクティブを書くことができます。stackoverflow.com/questions/28290332/...
heisian

1
ええ、私はフレームワークを一度調べたところ、ヘルパーがプルされた場所を見つけました。また、名前空間付き静的クラスのメソッドは、ほとんどの場合、要求されている、または推奨されているものよりもはるかにきれいに適合することに完全に同意します。実際のところ、ヘルパーはそもそもLaravel Wayではなく、段階的に廃止されていないCodeIgniter 2.xからのホールドオーバーです。したがって、このアプローチについて尋ねられたとおりに正確に応答しないという私の歩み方は、ヘルパーが得られないという事実を強調するための試みであり、むしろより良いものです。
Dan Hunsaker、2016年

315

私の最初の考えは、作曲家のオートロードでもありましたが、私にとっては、Laravel 5のようには感じられませんでした。L5はサービスプロバイダーを多用します。これらはアプリケーションをブートストラップするものです。

まず、appディレクトリにというフォルダを作成しましたHelpers。次に、Helpersフォルダー内に、追加したい機能のファイルを追加しました。フォルダに複数のファイルが含まれていると、1つの大きなファイルが長くなりすぎて管理できなくなるのを回避できます。

次にHelperServiceProvider.php、artisanコマンドを実行してを作成しました。

artisan make:provider HelperServiceProvider

registerメソッド内にこのスニペットを追加しました

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

最後にconfig/app.phpプロバイダー配列にあなたのサービスプロバイダーを登録します

'providers' => [
    'App\Providers\HelperServiceProvider',
]

今、あなたの中の任意のファイルHelpersディレクトリが読み込まれ、使用する準備ができています。

更新2016-02-22

ここには良いオプションがたくさんありますが、私の答えがあなたにとってうまくいくなら、私は先に進んでこの方法でヘルパーを含めるためのパッケージを作りました。インスピレーションを得るためにパッケージを使用することも、Composerでパッケージをダウンロードすることもできます。私が頻繁に使用する組み込みヘルパーがいくつかあります(ただし、デフォルトではすべて非アクティブです)。シンプルなArtisanジェネレーターで独自のカスタムヘルパーを作成できます。また、1つのレスポンダーがマッパーを使用するという提案に対処し、カスタムヘルパーを明示的に定義して、ヘルパーディレクトリ内のすべてのPHPファイルをロードするか、デフォルトで自動的にロードできるようにします。フィードバックとPRは大歓迎です!

composer require browner12/helpers

Github:browner12 / helpers


29
追加する必要のある機能が少ししかない人にとっては、composerのオートロードは完全に問題ありませんが、ヘルパー機能を多く持つ可能性がある私たちにとっては、複数のファイル編成が必須です。このソリューションは、ファイルをファイルに登録したことを除いて、本質的にはL4で行ったものstart.phpです(これは素晴らしいことではありませんでしたが、当時はその目的に役立ちました)。複数のファイルをロードするための別の提案がありますか?
Andrew Brown

7
複数のファイルがある場合は、それらをすべてcomposer.jsonファイルに追加します。でも、5-10行を追加することが可能な方法あなたがここに持っているものよりもより多くの意味を。
ジョセフシルバー、2015

22
このテクニックには多くのメリットがあると思います。ヘルパーファイルを作成するたびにcomposer.jsonファイルをいじる必要がないため、エレガントで効率的です。
impeto 2015年

8
本当に良い解決策です。私が同意しないのは、ファイルを追加する方法だけです。代わりに、ロードするファイルの名前を追加するマッパーである必要があると思います。エラーについて考えてください!失敗しているファイルの1つにヘルパーが1つしかない場合は、それらをすべて削除するか、解決するまでサイトを破壊する必要があります。
Pablo Ezequiel Leone、

3
App \ Providers名前空間を使用していますか?コントローラーとビューからそのヘルパーを呼び出す方法。申し訳ありませんが、noobの質問です。
Cengkaruk、2015年

79

これはJeffreyWay、このララキャストディスカッションで提案されているものです。

  1. app/Httpディレクトリ内にhelpers.phpファイルを作成し、関数を追加します。
  2. composer.jsonautoloadブロック内にを追加し"files": ["app/Http/helpers.php"]ます。
  3. を実行しますcomposer dump-autoload

15
ヘルパーはHTTPのみではない場合があります。app/helpers.phpまたはapp/Helpers/より良い場所のようです。
sepehr

1
共有サーバー上にいて、使用するオプションがない場合はcomposer dump-autoload どうなりますか?
user3201500 2016

@ user3201500は別の質問であり、上記の回答に従う場合は手動で行う必要があります。または、他の回答から選択することもできます。そして、手動で反映するために、composer dump-autoloadあなたがこれを辿ることがあります。developed.be/2014/08/29/composer-dump-autoload-laravel
itsazzad

55

SOとGoogleでさまざまな答えをふるいにかけても、最適なアプローチを見つけることができませんでした。ほとんどの回答は、アプリケーションを離れ、サードパーティのツールであるComposerに依存して仕事をしていることを示唆していますが、ファイルを含めるためだけにツールに結合することは賢明ではないと確信しています。

Andrew Brownの答えは、私がそれに取り組むべきであると私が思う方法に最も近くなりましたが、(少なくとも5.1では)サービスプロバイダーの手順は不要です。ハイジアンの答えは、その使用PSR-4が私たちに一歩近づくのを強調しています。ビューでのヘルパーの最終的な実装は次のとおりです。

まず、名前空間を使用して、appsディレクトリの任意の場所にヘルパーファイルを作成します。

namespace App\Helpers;

class BobFinder
{
    static function bob()
    {
        return '<strong>Bob?! Is that you?!</strong>';
    }
}

次に、配列config\app.php内のクラスのエイリアスを作成しますaliases

'aliases' => [
    // Other aliases
    'BobFinder' => App\Helpers\BobFinder::class
]

そして、それで十分です。PSR-4エイリアスはヘルパーをビューに公開する必要があるため、ビューでは次のように入力します。

{!! BobFinder::bob() !!}

それは出力するはずです:

<strong>Bob?! Is that you?!</strong>

これを投稿してくれてありがとう。@ Dan-Hunsakerが私のソリューションで指摘したように、まだグローバルに名前空間を持つ関数、つまり単純にを書くことができていませんでした{!! bob() !!}。さらに検索を行い、それが可能かどうかを確認します
heisian 2015年

1
私はそれについてもっと考えました、そしてbob()真にグローバルにしようとすることは賢明なことではないでしょう。名前空間が存在するのには理由があり、bob()基本的なPHP関数と一緒に呼び出すことはできません。私はあなたのエイリアシングビットを私のコードに追加します-ありがとう!
ハイジアン2015年

1
私はこれがすべての中で最高であると思います
ジミー・オボニョ・アバー

なんでextends Helper?私には必要ないようです。
bernie 2016年

@bernie @ user3201500申し訳ありませんが、すべてのヘルパーが継承する独自のベースヘルパークラスがありました。これextends Helperは実際には必要ありません。ヘッドアップをありがとう。
dKen 2016

31

Laravel 5のカスタムブレードディレクティブ

はい、これを行う別の方法があります!

ステップ1:カスタムBladeディレクティブを登録します。

<?php // code in app/Providers/AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use Blade; // <-- This is important! Without it you'll get an exception.

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
     public function boot()
     {
         // Make a custom blade directive:
         Blade::directive('shout', function ($string) {
             return trim(strtoupper($string), '(\'\')');
         });

         // And another one for good measure:
         Blade::directive('customLink', function () {
             return '<a href="#">Custom Link</a>';
         });
     }
    ...

ステップ2:カスタムBladeディレクティブを使用します。

<!-- // code in resources/views/view.blade.php -->

@shout('this is my custom blade directive!!')
<br />
@customLink

出力:

これは私のカスタムブレードディレクティブです!!
カスタムリンク


出典:https//laravel.com/docs/5.1/blade#extending-blade

参考資料:https : //mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives


どこでも使えるカスタムクラスを作成する方法を学びたい場合は、簡単な方法であるLaravel 5のカスタムクラスを参照してください。


質問は「一部のビュー間でコードが繰り返されないようにすること」だったので、これは最良の回答としてマークされるべきです。キーワードはVIEWSです。:)
Aleksandrs

23

これは私のHelpersProvider.phpファイルです。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    protected $helpers = [
        // Add your helpers in here
    ];

    /**
     * Bootstrap the application services.
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     */
    public function register()
    {
        foreach ($this->helpers as $helper) {
            $helper_path = app_path().'/Helpers/'.$helper.'.php';

            if (\File::isFile($helper_path)) {
                require_once $helper_path;
            }
        }
    }
}

Helpersそのappフォルダの下にというフォルダを作成してから、whatever.phpinside というファイルを作成しwhatever、$ helpers配列内に文字列を追加します。

できた!

編集する

このオプションはもう使用していません。現在、ヘルパーのような静的ファイルをロードするためにcomposerを使用しています。

ヘルパーは次の場所に直接追加できます。

...
"autoload": {
    "files": [
        "app/helpers/my_helper.php",
        ...
    ]
},
...

glob()Andrew Brownが書いたように、ディレクトリ内のすべてのファイルをロードする代わりに、マッパーを作成するパフォーマンス以外の理由はありますか?含めるファイルを指定できるようにしたい場合は、composer.jsonJoseph Silberが書いたように、でファイルをオートロードするように指定してみませんか?なぜこのソリューションを好むのですか?これが悪い解決策であると言っているのではなく、ただ興味があるだけです。
2015年

3
たとえば、ヘルパーファイルの1つに重大なエラーが含まれている場合は、マップアプローチを使用してヘルパーを選択的に有効または無効にする方が簡単です。とはいえ、サービスプロバイダーでのファイルのマッピングはcomposer.json、2つの点を除いて、マッピングを行うこととそれほど変わりません。まず、メタデータファイルではなく、アプリケーション自体の内部にマップを保持します。composer dump-autoload次に、ロードするファイルのリストを変更するたびに再実行する必要はありません。
Dan Hunsaker、2015年

必要はありませんincluderequire、Laravelすでに組み込まれているPSR-4のオートロード:php-fig.org/psr/psr-4
heisian

1
PSR-4とcomposerを使用すると、ヘルパーのオン/オフを切り替えることができません。
Pablo Ezequiel Leone

@PabloEzequielLeoneとコントローラーまたはブレードファイル内でどのように使用しますか?これは、すべてのコントローラーのすべてのヘルパーを毎回ロードしないことに関心がある場合は最良のオプションと思われますが、Laravelの初心者(私のように)には適していません。
VinGarcia 2017

12

私Laravelプロジェクトにカスタムヘルパーライブラリについては、私は名前のフォルダを作成しているLibraries私にはLaravel/Appディレクトリとライブラリディレクトリ内、私は別のヘルパーライブラリのさまざまなファイルを作成しました。

ヘルパーファイルを作成した後、これらのすべてのファイルを次のようにcomposer.jsonファイルに含めるだけです。

...
"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Libraries/commonFunctions.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
...

そして実行する

composer dump-autoload

composer dump-autoloadまた、composer dumpautoload実際に動作composer duすることも動作します...
Akshay Khale

10

OPがベストプラクティスを求めてきたため、ここではまだいくつかの良いアドバイスが欠けていると思います。

単一のhelpers.phpファイルは、良い習慣とはほど遠いものです。第一に、さまざまな種類の関数を混在させているため、優れたコーディング原則に違反しているからです。さらに、これはコードのドキュメントだけでなく、循環的複雑度保守インデックスハルステッドボリュームなどのコードメトリックにも悪影響を与える可能性があります。機能が多ければ多いほど、悪化します。

コードのドキュメントは、[OK]をはのようなツールを使用することになりphpDocumentorのが、使用してサミを、それは手続きのファイルが表示されません。Laravel APIドキュメントはそのようなケースです-ヘルパー関数のドキュメントはありません:https : //laravel.com/api/5.4

コードメトリックスは、PhpMetricsなどのツールで分析できます。PhpMetricsバージョン1.xを使用してLaravel 5.4フレームワークコードを分析すると、src / Illuminate / Foundation / helpers.phpファイルsrc / Illuminate / Support / helpers.phpファイルの両方に非常に悪いCC / MI / HVメトリックが表示されます。

複数のコンテキストヘルパーファイル(例:string_helpers.phparray_helpers.phpなど)は、これらの不良メトリックを確実に改善し、コードの管理を容易にします。使用するコードドキュメントジェネレーターによっては、これで十分です。

名前空間を使用してコンテキスト化できるように、静的メソッドでヘルパークラスを使用することでさらに改善できます。LaravelがすでにIlluminate\Support\StrIlluminate\Support\Arrクラスで行っているように。これにより、コードのメトリックス/組織とドキュメントの両方が改善されます。クラスエイリアスを使用すると、クラスエイリアスを使いやすくすることができます。

クラスを使って構造化すると、コードの編成とドキュメントが改善されますが、一方で、グローバルな関数を短く覚えやすいものから失うことになります。これらの静的クラスメソッドに関数エイリアスを作成することで、このアプローチをさらに改善できます。これは手動または動的に実行できます。

Laravelは、静的クラスメソッドにマップする手続き型ヘルパーファイルで関数を宣言することにより、内部的に最初のアプローチを使用します。すべてのもの(docblocks / arguments)を再宣言する必要があるため、これは理想的なものではない可能性があります。
私は個人的HelperServiceProviderに、実行時にこれらの関数を作成するクラスで動的アプローチを使用しています。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    /**
     * The helper mappings for the application.
     *
     * @var array
     */
    protected $helpers = [
        'uppercase' => 'App\Support\Helpers\StringHelper::uppercase',
        'lowercase' => 'App\Support\Helpers\StringHelper::lowercase',
    ];

    /**
     * Bootstrap the application helpers.
     *
     * @return void
     */
    public function boot()
    {
        foreach ($this->helpers as $alias => $method) {
            if (!function_exists($alias)) {
                eval("function {$alias}(...\$args) { return {$method}(...\$args); }");
            }
        }
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

これはエンジニアリングの問題だと言えますが、私はそうは思いません。これは非常にうまく機能し、少なくともPHP 7.xを使用している場合は、関連する実行時間のコストがかからないことが予想されます。


8

Laravel 5のファサードを非常にすばやく作成するために作成したbashシェルスクリプトを次に示します。

これをLaravel 5インストールディレクトリで実行します。

次のように呼び出します。

make_facade.sh -f <facade_name> -n '<namespace_prefix>'

例:

make_facade.sh -f helper -n 'App\MyApp'

この例を実行するFacadesProviders、「your_laravel_installation_dir / app / MyApp」の下にディレクトリが作成されます。

次の3つのファイルを作成し、それらを画面に出力します。

./app/MyApp/Facades/Helper.php
./app/MyApp/Facades/HelperFacade.php
./app/MyApp/Providers/HelperServiceProvider.php

完了すると、次のようなメッセージが表示されます。

===========================
    Finished
===========================

Add these lines to config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',

したがって、「config / app.php」のプロバイダーとエイリアスのリストを更新します

走る composer -o dumpautoload

「./app/MyApp/Facades/Helper.php」は、最初は次のようになります。

<?php

namespace App\MyApp\Facades;


class Helper
{
    //
}

次に、「./ app / MyApp / Facades / Helper.php」にメソッドを追加します。

ヘルパー関数を追加した後の "./app/MyApp/Facades/Helper.php"は次のようになります。

<?php

namespace App\MyApp\Facades;

use Request;

class Helper
{
    public function isActive($pattern = null, $include_class = false)
    {
        return ((Request::is($pattern)) ? (($include_class) ? 'class="active"' : 'active' ) : '');
    }
}

This is how it would be called:
===============================

{!!  Helper::isActive('help', true) !!}

この関数はパターンを期待し、オプションの2番目のブール引数を受け入れることができます。

現在のURLが渡されたパターンと一致する場合、「アクティブ」(または、関数呼び出しの2番目の引数として「true」を追加した場合は「クラス=アクティブ」)を出力します。

これを使用して、アクティブなメニューを強調表示します。

以下は私のスクリプトのソースコードです。お役に立てば幸いです。何か問題がありましたらお知らせください。

#!/bin/bash

display_syntax(){
    echo ""
    echo "  The Syntax is like this:"
    echo "  ========================"
    echo "      "$(basename $0)" -f <facade_name> -n '<namespace_prefix>'"
    echo ""
    echo "  Example:"
    echo "  ========"
    echo "      "$(basename $0) -f test -n "'App\MyAppDirectory'"
    echo ""
}


if [ $# -ne 4 ]
then
    echo ""
    display_syntax
    exit
else
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
    while [[ $# > 0 ]]
    do
        key="$1"
            case $key in
            -n|--namespace_prefix)
            namespace_prefix_in="$2"
            echo ""
            shift # past argument
            ;;
            -f|--facade)
            facade_name_in="$2"
            shift # past argument
            ;;
            *)
                    # unknown option
            ;;
        esac
        shift # past argument or value
    done
fi
echo Facade Name = ${facade_name_in}
echo Namespace Prefix = $(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
echo ""
}


function display_start_banner(){

    echo '**********************************************************'
    echo '*          STARTING LARAVEL MAKE FACADE SCRIPT'
    echo '**********************************************************'
}

#  Init the Vars that I can in the beginning
function init_and_export_vars(){
    echo
    echo "INIT and EXPORT VARS"
    echo "===================="
    #   Substitution Tokens:
    #
    #   Tokens:
    #   {namespace_prefix}
    #   {namespace_prefix_lowerfirstchar}
    #   {facade_name_upcase}
    #   {facade_name_lowercase}
    #


    namespace_prefix=$(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
    namespace_prefix_lowerfirstchar=$(echo ${namespace_prefix_in} | sed -e 's#\\#/#g' -e 's/^\(.\)/\l\1/g')
    facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u\1/')
    facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower($0)}')


#   Filename: {facade_name_upcase}.php  -  SOURCE TEMPLATE
source_template='<?php

namespace {namespace_prefix}\Facades;

class {facade_name_upcase}
{
    //
}
'


#  Filename: {facade_name_upcase}ServiceProvider.php    -   SERVICE PROVIDER TEMPLATE
serviceProvider_template='<?php

namespace {namespace_prefix}\Providers;

use Illuminate\Support\ServiceProvider;
use App;


class {facade_name_upcase}ServiceProvider extends ServiceProvider {

    public function boot()
    {
        //
    }

    public function register()
    {
        App::bind("{facade_name_lowercase}", function()
        {
            return new \{namespace_prefix}\Facades\{facade_name_upcase};
        });
    }

}
'

#  {facade_name_upcase}Facade.php   -   FACADE TEMPLATE
facade_template='<?php

namespace {namespace_prefix}\Facades;

use Illuminate\Support\Facades\Facade;

class {facade_name_upcase}Facade extends Facade {

    protected static function getFacadeAccessor() { return "{facade_name_lowercase}"; }
}
'
}


function checkDirectoryExists(){
    if [ ! -d ${namespace_prefix_lowerfirstchar} ]
    then
        echo ""
        echo "Can't find the namespace: "${namespace_prefix_in}
        echo ""
        echo "*** NOTE:"
        echo "           Make sure the namspace directory exists and"
        echo "           you use quotes around the namespace_prefix."
        echo ""
        display_syntax
        exit
    fi
}

function makeDirectories(){
    echo "Make Directories"
    echo "================"
    mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
    mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
    mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
}

function createSourceTemplate(){
    source_template=$(echo "${source_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create Source Template:"
    echo "======================="
    echo "${source_template}"
    echo ""
    echo "${source_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}.php
}

function createServiceProviderTemplate(){
    serviceProvider_template=$(echo "${serviceProvider_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create ServiceProvider Template:"
    echo "================================"
    echo "${serviceProvider_template}"
    echo ""
    echo "${serviceProvider_template}" > ./${namespace_prefix_lowerfirstchar}/Providers/${facade_name_upcase}ServiceProvider.php
}

function createFacadeTemplate(){
    facade_template=$(echo "${facade_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create Facade Template:"
    echo "======================="
    echo "${facade_template}"
    echo ""
    echo "${facade_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}Facade.php
}


function serviceProviderPrompt(){
    echo "Providers: ${namespace_prefix_in}\Providers\\${facade_name_upcase}ServiceProvider,"
}

function aliasPrompt(){
    echo "Alias: '"${facade_name_upcase}"' => '"${namespace_prefix_in}"\Facades\\${facade_name_upcase}Facade'," 
}

#
#   END FUNCTION DECLARATIONS
#


###########################
## START RUNNING SCRIPT  ##
###########################

display_start_banner

init_and_export_vars
makeDirectories 
checkDirectoryExists
echo ""

createSourceTemplate
createServiceProviderTemplate
createFacadeTemplate
echo ""
echo "==========================="
echo "  Finished TEST"
echo "==========================="
echo ""
echo "Add these lines to config/app.php:"
echo "----------------------------------"
serviceProviderPrompt
aliasPrompt
echo ""

8

カスタムヘルパークラスを含める代わりに、config/app.phpエイリアスの下で実際にファイルに追加できます。

このようになります。

 'aliases' => [ 
    ...
    ...
    'Helper' => App\Http\Services\Helper::class,
 ]

次に、コントローラに、メソッド 'use Helper'を使用してヘルパーを含めます。これにより、ヘルパークラスのメソッドの一部を簡単に呼び出すことができます。

eg. Helper::some_function();

またはリソースビューで、直接Helperクラスを直接呼び出すことができます。

eg. {{Helper::foo()}}

しかし、これは依然として従うべき開発者コーディングスタイルのアプローチです。私たちは問題を解決する別の方法を持っているかもしれません、そして私は初心者のために私があまりにも持っているものを共有したいだけです。


4

カスタムヘルパーのディレクトリを作成します。 まず、アプリケーションディレクトリにヘルパーディレクトリを作成します。 hlperクラス定義の作成: 2つの文字列を連結する単純なヘルパー関数を作成しましょう。/app/Helpers/MyFuncs.phpに新しいファイルMyFuncs.phpを作成します次のコードを追加します

<?php

namespace App\Helpers;

class MyFuncs {

    public static function full_name($first_name,$last_name) {
        return $first_name . ', '. $last_name;   
    }
}

名前空間App \ Helpers; App名前空間の下にHelpers名前空間を定義します。クラスMyFuncs {…}は、ヘルパークラスMyFuncsを定義します。public static function full_name($ first_name、$ last_name){…}は、2つの文字列パラメーターを受け入れ、連結された文字列を返す静的関数を定義します

ヘルパーサービス提供クラス

サービスプロバイダーは、クラスの自動読み込みに使用されます。すべてのヘルパークラスを/ app / Helpersディレクトリにロードするサービスプロバイダーを定義する必要があります。

次のartisanコマンドを実行します。

php artisan make:provider HelperServiceProvider

ファイルが作成されます /app/Providers/HelperServiceProvider.php

Open /app/Providers/HelperServiceProvider.php

次のコードを追加します。

<?php 

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider {

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

   /**
    * Register the application services.
    *
    * @return void
    */
   public function register()
   {
        foreach (glob(app_path().'/Helpers/*.php') as $filename){
            require_once($filename);
        }
   }
}

ここに、

namespace App\Providers; defines the namespace provider
use Illuminate\Support\ServiceProvider; imports the ServiceProvider class namespace
class HelperServiceProvider extends ServiceProvider {…} defines a class HelperServiceProvider that extends the ServiceProvider class
public function boot(){…} bootstraps the application service
public function register(){…} is the function that loads the helpers
foreach (glob(app_path().'/Helpers/*.php') as $filename){…} loops through all the files in /app/Helpers directory and loads them.

次に、HelperServiceProviderを登録し、ヘルパーのエイリアスを作成する必要があります。

/config/app.phpファイルを開く

プロバイダー配列変数を見つける

次の行を追加します

App\Providers\HelperServiceProvider::class,

エイリアス配列変数を見つける

次の行を追加します

'MyFuncs' => App\Helpers\MyFuncs::class,

カスタムヘルパーを使用して変更を保存する

カスタムヘルパー関数Open /app/routes.phpを呼び出すルートを作成します

次のルート定義を追加します

Route::get('/func', function () {
    return MyFuncs::full_name("John","Doe");
});

ここに、

return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class

4

まずApp \ Httpディレクトリ内にhelpers.phpを作成します。次に、composer.json内に次のコードを追加します

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

次に、次のコマンドを実行します

composer dump-autoload

これで、helpers.phpファイル内にカスタム関数を定義できます。


3

私が使用したもう1つの方法は次のとおりです。1)app \ FolderName \ fileName.phpにファイルを作成し、その中にこのコードを含めました。

<?php
namespace App\library
{
 class hrapplication{
  public static function libData(){
   return "Data";
  }
 }
}
?>

2)その後、私たちのブレードで

 $FmyFunctions = new \App\FolderName\classsName;
  echo $is_ok = ($FmyFunctions->libData());

それでおしまい。そしてそれは動作します


3

カスタムヘルパーを書くためのベストプラクティスは

1)appプロジェクトルートのディレクトリ内に、Helpersという名前のフォルダーを作成します(コードを分離して構造化するだけです)。

2)フォルダー内にpsr-4ファイルまたは通常のphpファイルを書き込みます

PHPファイルの形式がpsr-4の場合は、自動ロードされます。それ以外の場合は、プロジェクトのルートディレクトリ内にあるcomposer.jsonに次の行を追加します。

autoloadキー内に、files自動ロード時にファイルをロードするという名前の新しいキーを作成し、filesオブジェクト内にアプリディレクトリから始まるパスを追加します。以下に例を示します。

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/Helpers/customHelpers.php"
    ]
},
"autoload-dev": {
    "classmap": [
        "tests/TestCase.php"
    ]
},

PS:composer dump-autoloadファイルが読み込まれていない場合は実行してみてください。


3

app / Helper / Helpers.phpにHelpers.phpを作成します

namespace App\Helper
class Helpers
{


}

作曲家と作曲家のアップデートを追加

 "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories",
            "database","app/Helper/Helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        },
         "files": ["app/Helper/Helpers.php"]
    },

コントローラでの使用

App \ Helper \ Helpersを使用します

config-> app.phpファイルのビュー変更で使用

   'aliases' => [
    ...
    'Helpers'   => 'App\Helper\Helpers'
    ],

ビューの呼び出し

<?php echo Helpers::function_name();  ?>

ありがとうございます。説明を少し広げていただけませんか?
フェリペバルデス

2
クラスの名前空間が指定されている場合、composer.jsonpsr-4 autoloadが機能するため、ファイルを追加しても意味がありません。
Arcesilas

2

dir bootstrap \ autoload.php

require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add

このファイルを追加

app\Helpers\function.php

2

**

  • ステータスヘルパー

**新しいヘルパーを作成する

<?php

namespace App\Helpers;

use Illuminate\Database\Eloquent\Collection;

class StatusHelper
{
 protected static $_status = [
        1=> [
            'value' => 1,
            'displayName' => 'Active',
        ],
        2 => [
            'value' => 2,
            'displayName' => 'Inactive',
        ],
        3 => [
            'value' => 3,
            'displayName' => 'Delete',
        ],

    ];

     public static function getStatusesList()
    {
        $status = (new Collection(self::$_status))->pluck('displayName', 'value')->toArray();


        return $status;
    }
}

コントローラーとビューファイルに使用

use App\Helpers\StatusHelper;

class ExampleController extends Controller
{
        public function index()
        {
            $statusList = StatusHelper::getStatusesList();

            return view('example.index', compact('statusList'));
        }
}

0

laravel 5.3以降では、laravelチームがすべての手続き型ファイル(routes.php)をapp/ディレクトリから移動し、app/フォルダー全体がpsr-4自動ロードされました。受け入れられた回答はこの場合は機能しますが、私には正しくありません。

それで私がやったことhelpers/は、プロジェクトのルートにディレクトリを作成し、その中にヘルパーファイルを配置し、私のcomposer.jsonファイルに次のようにしたことです。

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

このように app/ディレクトリはまだpsr-4自動ロードされたディレクトリであり、ヘルパーは少し整理されています。

これが誰かを助けることを願っています。


0

ここには素晴らしい答えがありますが、これが最も簡単だと思います。Laravel 5.4(および以前のバージョンでも同様)では、App / Libraries / Helper.phpなどの便利な場所にクラスを作成できます。

class Helper() {
    public function uppercasePara($str) {
        return '<p>' .strtoupper($str). '<p>;
    }
}

次に、Bladeテンプレートで次のように呼び出すだけです。

@inject('helper', \App\Libraries\Helper)
{{ $helper->drawTimeSelector() }}

@injectを使用したくない場合は、「uppercasePara」関数を静的にして、次のようにBladeテンプレートに呼び出しを埋め込みます。

{{ \App\Libraries\Helper::drawTimeSelector() }}

エイリアスは必要ありません。Laravelは具象クラスを自動的に解決します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.