web-dev-qa-db-fra.com

Laravel: Où stocker les données et les constantes des tableaux globaux?

Je viens de commencer à travailler avec Laravel. J'ai besoin de réécrire tout un système que j'ai créé il y a quelques années, en utilisant Laravel 4 comme infrastructure de base. Dans mon ancien système, j'utilisais un fichier constant.php avec des constantes déclarées et un globals Fichier .php contenant beaucoup d'ensembles de tableaux (par exemple, statuts de catégories, type d'événements, langs, etc.). Ce faisant, je pourrais utiliser quelque chose comme:

foreach ( $langs as $code => $domain ) {
    // Some stuff
}

n'importe où dans mon application.

Ma question est, comment puis-je stocker cette information dans le soi-disant "chemin Laravel". J'ai essayé d'utiliser une sorte d'objet pour stocker ces informations, de les définir comme un service et de lui créer une façade:

app/libraries/Project/Constants.php

namespace PJ;

class Constants {

    public static $langs = [
            'es' => 'www.domain.es',
            'en' => 'www.domain.us',
            'uk' => 'www.domain.uk',
            'br' => 'www.domain.br',
            'it' => 'www.domain.it',
            'de' => 'www.domain.de',
            'fr' => 'www.domain.fr'
        ];

}

app/libraries/Project/ConstantsServiceProvider.php

namespace PJ;

use Illuminate\Support\ServiceProvider;

class ConstantsServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->singleton('PJConstants', function() {
            return new Constants;
        });
    }
}

app/libraries/Project/ConstantsFacade.php

namespace PJ;

use Illuminate\Support\Facades\Facade;

class ConstantsFacade extends Facade {
    protected static function getFacadeAccessor() { 
        return 'PJConstants';
    }
}

composer.json

"psr-4": {
     "PJ\\": "app/libraries/Project"
},

et donc j'accède à cette propriété en tant que PJ\Constants :: $ langs.

Cela fonctionne, mais je doute que ce soit la manière la plus efficace/correcte de le faire. Je veux dire, est-ce la bonne façon de "propager" une variable en créant un fournisseur de services temporaire, des façades, etc.? Ou où devrais-je mettre ces données?

Merci pour tout conseil.

EDIT # 01

Les données que je souhaite transmettre à tous les contrôleurs et les vues peuvent être directement définies dans un script, comme dans l'exemple au début de mon message, mais elles peuvent également être générées de manière dinamique, à partir d'une base de données par exemple. Ces données pourraient être une liste de catégories. J'en ai besoin dans toutes les vues pour générer une barre de navigation, mais j'ai également besoin de définir des modèles de routage (comme/catégorie/sous-catégorie/produit) et d'analyser des informations dans plusieurs contrôleurs (comme obtenir des informations de la catégorie qui contient X produit).

Mon tableau est quelque chose comme:

$categories = [
    1 => ['name' => 'General', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    2 => ['name' => 'Nature', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    3 => ['name' => 'World', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    4 => ['name' => 'Animals', 'parent' => 2, 'description' => 'Lorem ipsum...']
]

Juste à titre d'exemple. Index est l'id de la catégorie et la valeur est une information associée à la catégorie.

J'ai également besoin de ce tableau, disponible dans tous les contrôleurs et toutes les vues.

Donc, si je l’enregistre en tant que variable de configuration, est-ce que ça va? Ou comment pourrais-je stocker ces données? Quelle serait la meilleure façon sémantiquement correcte?

Merci

74

Pour la plupart des constantes utilisées globalement dans l'application, les stocker dans des fichiers de configuration est suffisant. C'est aussi assez simple

Créer un nouveau fichier dans le app/config répertoire. Appelons cela constants.php

Vous devez y retourner un tableau de valeurs de configuration.

return [
    'langs' => [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us'
        // etc
    ]
];

Et vous pouvez y accéder comme suit

Config::get('constants.langs');
// or if you want a specific one
Config::get('constants.langs.en');

Et vous pouvez aussi les définir

Config::set('foo.bar', 'test');

Notez que les valeurs que vous définissez ne persisteront pas. Ils ne sont disponibles que pour la demande en cours.

Mise à jour

La configuration n'est probablement pas le bon endroit pour stocker les informations générées à partir de la base de données. Vous pouvez simplement utiliser un Eloquent Model comme:

class Category extends Eloquent {
    // db table 'categories' will be assumed
}

Et interroger toutes les catégories

Category::all();

Si, pour une raison quelconque, le modèle ne fonctionne pas, vous pouvez commencer à penser à la création de votre propre classe et d'une façade. Ou vous pouvez simplement créer une classe avec toutes les variables et méthodes statiques, puis l’utiliser sans les éléments de façade.

104
lukasgeiter

pour les constantes

Créez le fichier constants.php dans le répertoire config: -

define('YOUR_DEFINED_CONST', 'Your defined constant value!');

return [

'your-returned-const' => 'Your returned constant value!'

];

Vous pouvez les utiliser comme: -

echo YOUR_DEFINED_CONST . '<br>';

echo config('constants.your-returned-const');

Pour les tableaux statiques

Créez un fichier static_arrays.php dans le répertoire config: -

class StaticArray
{

    public static $langs = [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us',
        'uk' => 'www.domain.uk',
        'br' => 'www.domain.br',
        'it' => 'www.domain.it',
        'de' => 'www.domain.de',
        'fr' => 'www.domain.fr'
    ];

}

Vous pouvez l'utiliser comme: -

echo StaticArray::$langs['en'];

Remarque: Laravel inclut automatiquement tous les fichiers de configuration, vous n'avez donc pas besoin d'inclure manuellement :)

20
Gagandeep Gambhir

Pour les constantes globales dans Laravel 5, je n'aime pas appeler Config pour elles. Je les définit dans le groupe Route comme suit:

// global contants for all requests
Route::group(['prefix' => ''], function() {
    define('USER_ROLE_ADMIN','1');
    define('USER_ROLE_ACCOUNT','2');
});
8

Constantes à Laravel

app/constants.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

    //EX
    define('COLOR_TWO', 'red');

composer.json ajouter l'emplacement du fichier lors de l'autoload dans composer.json

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

Avant que cette modification puisse prendre effet, vous devez exécuter la commande suivante dans Terminal pour régénérer les fichiers de chargement automatique de Laravel:

composer dump-autoload
3
Terminal

Je pense que le meilleur moyen est d'utiliser la localisation.

Créer un nouveau fichier messages.php dans resources/lang/en (en parce que c’est ce qui est défini dans mon config/app'locale'=>'en') retourne un tableau de toutes vos valeurs

return [
    'welcome' => 'Welcome to our application'
];

récupérer pour laravel 5.3 et inférieur

echo trans('messages.welcome');

ou

echo Lang::get('messages.welcome');

pour 5.4 utilisation

echo __('messages.welcome') 

localisation de laravel 5.

ou

localisation de laravel 5.4

2
Bill Stephen

Pour ajouter à la réponse ci-dessus, vous devrez inclure la classe de configuration avant de pouvoir l’utiliser dans Laravel 5.3

use Illuminate\Support\Facades\Config;
2
Jignesh Rawal

Au moins dans Laravel 5.4, dans votre constructeur, vous pouvez les créer;

public function __construct()
{
  \Config::set('privileged', array('user1','user2');
  \Config::set('SomeOtherConstant', 'my constant');     
}     

Ensuite, vous pouvez les appeler comme ça dans vos méthodes;

\Config::get('privileged');

Particulièrement utile pour les méthodes statiques dans le modèle, etc.

Référence sur Laracasts.com https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found

1
blamb