web-dev-qa-db-fra.com

Où est-ce que je mets Laravel 4 fonctions d'assistance pouvant afficher des messages flash?

J'ai écrit une simple fonction display_messages() qui recherche dans Session::get('errors') les données Flash et les renvoie à l'écran.

Où est-ce que je mets cette fonction? Dans Codeigniter, vous avez un dossier helpers où vous pouvez coller toutes vos petites méthodes d’aide globale. 

20
Chris G.

Comme suggéré par Usman,

  • créer un fichier /application/libraries/demo.php
  • définir une class Demo() { à l'intérieur
  • appeler la fonction comme suit: {{ Demo::display() }} 

Fonctionne parce que les bibliothèques et les modèles sont automatiquement chargés dans la ligne 76 de start.php. Je pense que les noms de fichiers doivent correspondre à Classnames (note capital).

<?php

class Demo {

    public static function display() {

        if( !$message = Session::get('errors'))
            $message = 'No Errors';

        echo "<pre>print_r($message)</pre>";

    }

}

Je n'arrive pas à comprendre pourquoi j'ai eu un problème avec le nom de classe Common, il peut y avoir un conflit (vous pouvez définir un espace de nom si cela est important) ...

20
ptim

Créez un dossier helpers dans votre dossier d'application et créez un fichier application_helper.php. Avec un tel code:

// app/helpers/application_helper.php

function display_messages()
{
  exit('Yes');
}

Ensuite, ouvrez votre fichier composer.json à la racine. autoload app/helpers/application_helper.php with composer files.

"autoload": {
....

    "files": [
        "app/helpers/application_helper.php"
    ]

Terminé, vous pouvez maintenant appeler display_messages().

Certains autochargeurs peuvent vous demander d'exécuter la commande composer dump pour la première fois.

13
Usman

Merci memeLab a fourni une réponse très utile qui m'a beaucoup aidé. Je voulais juste développer sa réponse car le dossier "libraries" n'était pas un répertoire de chargement automatique, du moins pas dans la version/version actuelle de L4 que j'utilise. De plus, le fichier start.php semble avoir été développé pour devenir le dossier start avec global.php, local.php et artisan.php. 

Donc, pour utiliser vos propres classes pour des bibliothèques séparées ou des helpers avec le chargeur automatique paresseux L4, il vous suffit d’inclure le dossier dans lequel vous souhaitez les stocker dans le global.php. Par exemple, j'ai ajouté un dossier libraries à la liste des répertoires.

ClassLoader::addDirectories(array(

    app_path().'/commands',
    app_path().'/controllers',
    app_path().'/models',
    app_path().'/database/seeds',
    // this a custom path
    app_path().'/libraries',

));

Quelle que soit la classe que vous définissez dans ce dossier en tant que classname.php, elle peut être appelée via CLASSNAME::methodName($someVar); dans vos contrôleurs.

class CLASSNAME {

    public static function methodName($someVar=NULL) {

        // whatever you want to do...

        return $message;
    }

}

Ainsi, de cette manière, vous pouvez créer une classe d'assistance et définir différentes méthodes à utiliser dans tous vos contrôleurs. Veillez également à définir les fonctions normales en dehors de votre classe de cette manière, car elles ne fonctionneront pas (car la classe n'est pas toujours chargée). (par exemple, someFunctionName($someVar); au lieu de CLASSNAME::methodName($someVar);) Si vous voulez créer des fonctions de cette manière, vous devez vous assurer que le fichier est chargé, mais je ne vais pas en dire plus à ce sujet, car il est préférable d’utiliser les classes de chargement paresseux pour de telles choses. chargez uniquement les classes dont vous avez vraiment besoin. 

Merci encore à memeLab et Usman, je n’aurais pas pu aller aussi loin sans leurs réponses. :)

11
riotCode

Pour le chargement Classes :

Créez app/libraries/class/Message.php et ajoutez la classe dans le fichier

class Message {
    public static function display() {

    }
}

Ajouter "app/libraries/class" à composer.json

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "app/libraries/class"
    ]
},

Enfin, lancez composer dump-autoload en ligne de commande.

Vous pouvez y accéder par Message::display()

Pour le chargement de php plain/non fonctionnel Fonctions :

Créer app/libraries/function/display_messages.php et ajouter une fonction dans un fichier

function display_messages() {

}

ajouter une ligne dans start/global.php

require app_path().'/libraries/function/display_messages.php';

Vous pouvez y accéder simplement par display_messages()

7
Chen-Tsu Lin

Ajoutez ceci dans app/start/global.php

require app_path().'/config/autoload.php';
require app_path().'/start/loader.php';
App::instance('loader',new loader($autoload));

créez un nouveau fichier loader.php dans app/start et ajoutez:

class loader{
private $helpers = array();
public $autoload = array(
    'helpers' => array()
);
function __construct($autoload  = array()) {
    if (!empty($autoload))
        $this->autoload = $autoload;
    foreach ($this->autoload as $key => $value)
    {
        $function = strtolower($key);
        $this->$function($value);
    }
}
function helpers($helpers=array())
{
    if (!is_array($helpers))
        $helpers = explode(",",$helpers);
    foreach ($helpers as $key => $value) {
        $this->helper($value);
    }

}
function helper($helper = '',$path = '/')
{
    $folder = app_path().'/helpers'.$path;
    if (file_exists($folder.$helper.'.php') && !in_array($helper, $this->helpers)){
        $this->helpers[] = $helper;
        require $folder.$helper.'.php';
    }
    else{
        $segments = explode('/',$helper);
        if (is_dir($folder.$segments[0])){
            array_shift($segments); 
            $this->helper($segments,$path.$segments[0].'/');
        }
    }
}

}

créez un nouveau fichier autoload.php dans app/config et ajoutez:

$autoload['helpers'] = array('functions'); // my autoload helpers!

créer un nouveau dossier assistants dans app /, ajouter vos fichiers d'assistance. (es. myhelper.php) 

function myhelper()
{
echo 'helper';
}

dans votre contrôleur, ajoutez:

App::make('loader')->helper('myhelper');
    myhelper();
1
AldoZumaran

J'ai utilisé ce tutoriel et je pense que c'est la méthode la plus simple: http://laravel-recipes.com/recipes/50/creating-a-helpers-file

  1. Commencez par créer le fichier app/helpers.php.
  2. Ensuite, chargez-le au bas de app\start\global.php comme suit.

    // au bas du fichier require app_path (). '/ helpers.php';

Ou changez votre fichier composer.json et déchargez le chargeur automatique.

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

$ composer dump-auto

  1. alors vous pouvez écrire vos fonctions dans helpers.php et les appeler de n'importe où

    function myfunction($result){ 
         return $result;
        }
    
0
Laura Chesches

En L3, je créerais normalement un fichier application/libraries/helpers.php et le require_once() dans mon application/start.php. Semblable à la façon dont L3 a un fichier laravel/helpers.php.

Je suppose qu'il y a quelque chose de similaire que vous pouvez faire en L4.

EDIT: En regardant la source, app/start/local.php semble être l’endroit idéal.

0
Colin