web-dev-qa-db-ja.com

任意のコントローラーおよびブレードファイルからアクセスできるグローバル関数を作成する方法

2つのコントローラーファイルhomecontrollerとbackendcontrollerがあります。グローバル関数を作成し、両方のファイルからアクセスする最良の方法は何ですか?

here Arian Acostaの答えは役に立ちましたが、最も簡単な方法はないかと思います。提案をいただければ幸いです。

20
Johnny

任意の名前の共通ファイルを作成します。例えばCommon.phpで、その中にすべての共通機能を記述します。コントローラでこの共通機能にアクセスする場合は、「use」を使用してこのCommon.phpファイルを含めるだけです。

use Common;

その後、Common.phpに含まれるすべての共通関数にアクセスできます。同様に、他のコントローラーで行います。

6
Rahul Chauhan

解決

これを行う1つの方法は、クラスを作成してそのインスタンスを使用することです。この方法では、コントローラー、ブレード、または他のクラス内のクラスのオブジェクトにもアクセスできません。

AppHelperファイル

あなたのアプリフォルダにHelpersという名前のフォルダを作成し、その中にファイル名AppHelperまたは任意の選択を作成します

<?php
namespace App\Helpers;

class AppHelper
{
      public function bladeHelper($someValue)
      {
             return "increment $someValue";
      }

     public function startQueryLog()
     {
           \DB::enableQueryLog();
     }

     public function showQueries()
     {
          dd(\DB::getQueryLog());
     }

     public static function instance()
     {
         return new AppHelper();
     }
}

使用法

コントローラー内

コントローラ内では、さまざまな機能を呼び出すことができます

public function index()
{
    //some code

   //need to debug query
   \App\Helpers\AppHelper::instance()->startQueryLog();

   //some code that executes queries
   \App\Helpers\AppHelper::instance()->showQueries();
}

ブレードファイル内

ブレードファイルを使用しているとしましょう。アプリブレードヘルパー関数を呼び出す方法は次のとおりです。

some html code
{{ \App\Helpers\AppHelper::instance()->bladeHelper($value) }}
and then some html code

名前空間のオーバーヘッドを削減する(オプション)

また、config\app.phpAppHelperクラスのエイリアスを作成することにより、完全な関数名前空間\ App\Helpersを呼び出すオーバーヘッドを削減できます。

'aliases' => [
       ....
       'AppHelper' => App\Helpers\AppHelper::class
 ]

コントローラーまたはブレードファイルで、直接呼び出すことができます

\AppHelper::instance()->functioName();
47
Max Gaurav

簡単な解決策:

  1. Helpersディレクトリに新しいappフォルダーを作成します。
  2. phpフォルダーに_your_helper_function.php_という名前のHelpersファイルを作成します。
  3. _your_helper_function.php_内に関数を追加します

    _function your_function($parameters){
    
        //function logic
    
    } 
    _
  4. このファイルを_composer.json_のFilesキーに追加します

    _
    "autoload": {
        ...
        "files": [
            "app/Helpers/your_helper_function.php"
        ]
        ...
    }
    _
  5. そして最後にcomposerファイルを自動読み込みします。これをプロジェクトディレクトリで実行します)

    _composer dump-autoload_

それでおしまい!これで、laravelプロジェクトの任意の部分でyour_function()にアクセスできます。

複数の関数をグローバルに利用可能にしたい場合は、すべてを単一のファイルに入れて、そのファイルをステップ4に示すように_composer.json_のFilesキーに追加できます。

まだ混乱がある場合は、これを行う方法についての私のブログ投稿を確認してください:

Laravel Composerを使用してグローバル関数を追加する方法?

22
Sapnesh Naik

あなたのController.php which extends BaseController、次のような関数を作成できます。

public function data($arr = false)
{
 $data['foo'] = 'bar';
 return array_merge($data,$arr);
}

また、ビューにデータを送信するときに任意のコントローラーから。

public function example()
{
 $data['smthg'] = 'smthgelse';
 return view('myView',$this->data($data));
}

メインコントローラーのデータには、すべてのコントローラーとブレードからアクセスできます。

4
Murat Bagsiz

Laravelはデフォルトで名前空間を使用します。そのため、ヘルパーファイルをセットアップするには、その回答に記載されている方法に従う必要があります。

あなたの場合では、異なるコントローラのメソッドにアクセスしたいのですが。これにはもっと簡単な方法があります。ベースコントローラーにメソッドを追加app/Http/Controllers/Controller.phpそして、他のすべてのコントローラーでそれらにアクセスできるのは、それらが拡張されているからです。

// in app/Http/Controllers/Controller.php
protected function dummy()
{
    return 'dummy';
}

// in homecontroller

$this->dummy();
3
Sandeesh

追加しようとしている機能に応じて、いくつかの方法があります。

1)Controller.php内に関数を作成し、他のすべてのコントローラーにそのコントローラーを拡張させます。これをmaster.blade.phpと多少比較することができます

2)トレイトを作成します。トレイトはあなたのために多くのことを行い、あなたのコントローラーをきれいに保ちます。私は個人的には、きれいに見える特性を使用するのが大好きです。私のController.phpが大量の異なるコード行で混乱しないようにしてください。

1
killstreet