web-dev-qa-db-fra.com

comment créer une fonction globale accessible depuis n'importe quel fichier de contrôleur ou de lame

J'ai deux homecontroller de fichier de contrôleur et backendcontroller. Quel est le meilleur moyen de créer une fonction globale et d'y accéder à partir des deux fichiers?

J'ai trouvé la réponse de ici d'Arian Acosta utile mais je me demande s'il existe un moyen plus simple. J'apprécierais toutes suggestions.

20
Johnny

Faire un fichier commun avec n'importe quel nom. Pour par exemple. Common.php et écrivez toute la fonction commune en son sein. Maintenant, si vous voulez accéder à cette fonction commune dans votre contrôleur, incluez simplement ce fichier Common.php en utilisant "use".

use Common;

Ensuite, vous pouvez accéder à toutes les fonctions communes incluses dans Common.php. De même le faire dans un autre contrôleur.

6
Rahul Chauhan

Solution

Une façon de procéder consiste à créer une classe et à utiliser son instance. Ainsi, vous ne pourrez pas uniquement accéder à l'objet de la classe dans un contrôleur, une lame ou toute autre classe.

Fichier AppHelper

Dans votre dossier d'applications, créez un dossier nommé Helpers et créez-y un nom de fichier AppHelper ou tout autre choix.

<?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();
     }
}

Usage

Dans un contrôleur

Lorsque vous êtes dans un contrôleur, vous pouvez appeler les différentes fonctions

public function index()
{
    //some code

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

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

Dans un fichier lame

Supposons que vous vous trouviez dans un fichier blade, voici comment appeler la fonction d'assistance de l'application blade

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

Réduire la surcharge d'espace de noms (facultatif)

Vous pouvez également réduire le temps d’appel de l’espace de noms de fonction complet \ App\Helpers en créant un alias pour la classe AppHelper dans config\app.php

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

et dans votre contrôleur ou votre fichier de lame, vous pouvez appeler directement

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

Une solution simple:

  1. Créez un nouveau dossier Helpers dans votre répertoire app.
  2. Créez un fichier php nommé your_helper_function.php Dans ce dossier Helpers.
  3. Ajoutez votre fonction dans your_helper_function.php

    function your_function($parameters){
    
        //function logic
    
    } 
    
  4. Ajoutez ce fichier à la clé Files de votre composer.json Comme

    
    "autoload": {
        ...
        "files": [
            "app/Helpers/your_helper_function.php"
        ]
        ...
    }
    
  5. Et enfin, régénérez composer fichiers à chargement automatique. (Exécutez-le dans le répertoire de votre projet)).

    composer dump-autoload

C'est ça! et maintenant vous pouvez accéder à your_function() dans n’importe quelle partie de votre projet laravel.

Si vous souhaitez que plusieurs fonctions soient disponibles globalement, vous pouvez toutes les placer dans un seul fichier et ajouter ce fichier à la clé Files de composer.json, Comme indiqué à l'étape 4.

Si vous avez toujours une confusion, vérifiez sur mon blog comment faire ceci:

Comment ajouter une fonction globale dans Laravel en utilisant Composer?

22
Sapnesh Naik

Dans votre Controller.php lequel extends BaseController, vous pouvez créer une fonction comme;

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

Et à partir de n’importe quel contrôleur lorsque vous envoyez des données à une vue;

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

Les données du contrôleur principal sont accessibles à partir de tous les contrôleurs et lames.

4
Murat Bagsiz

Laravel utilise les espaces de noms par défaut. Vous devez donc suivre la méthode décrite dans cette réponse pour configurer un fichier d'assistance.

Bien que dans votre cas, vous souhaitiez accéder à une méthode dans différents contrôleurs. Pour cela, il existe un moyen plus simple. Ajouter une méthode à votre contrôleur de base app/Http/Controllers/Controller.php et vous pouvez y accéder dans tous les autres contrôleurs, car ils l'étendent.

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

// in homecontroller

$this->dummy();
3
Sandeesh

Il existe plusieurs façons, en fonction de la fonctionnalité exacte que vous essayez d'ajouter.

1) Créez une fonction dans Controller.php et faites en sorte que tous les autres contrôleurs étendent ce contrôleur. Vous pourriez un peu comparer cela au master.blade.php

2) Créer un trait, un trait peut faire beaucoup pour vous et garder vos contrôleurs propres. Personnellement, j'adore utiliser les caractéristiques, car elles auront l'air propres. Veillez à ce que mon Controller.php ne soit pas un foutoir avec des tonnes de lignes de code différentes.

1
killstreet