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.
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.
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.
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();
}
}
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();
}
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
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();
Helpers
dans votre répertoire app
.php
nommé your_helper_function.php
Dans ce dossier Helpers
.Ajoutez votre fonction dans your_helper_function.php
function your_function($parameters){
//function logic
}
Ajoutez ce fichier à la clé Files
de votre composer.json
Comme
"autoload": {
...
"files": [
"app/Helpers/your_helper_function.php"
]
...
}
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?
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.
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();
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.