Acabo de empezar a trabajar con Laravel. Necesito reescribir todo un sistema que hice hace algunos años, usando Laravel 4 como marco base. En mi antiguo sistema, solía tener un constant.php
archivo con algunas constantes declaradas y un globals.php
archivo que contenía muchos conjuntos de matrices (por ejemplo, estados de categorías, tipo de eventos, langs, etc.). Al hacerlo, podría usar algo como
foreach ( $langs as $code => $domain ) {
// Some stuff
}
en cualquier lugar de mi aplicación.
Mi pregunta es, ¿cómo puedo almacenar esa información en la llamada "forma laravel". Intenté usar algún tipo de objeto para almacenar esta información, configurándolo como un servicio y creando para él una fachada:
aplicación / bibliotecas / Proyecto / 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'
];
}
aplicación / bibliotecas / Proyecto / ConstantsServiceProvider.php
namespace PJ;
use Illuminate\Support\ServiceProvider;
class ConstantsServiceProvider extends ServiceProvider {
public function register() {
$this->app->singleton('PJConstants', function() {
return new Constants;
});
}
}
aplicación / bibliotecas / Proyecto / 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"
},
y así accedo a esa propiedad como PJ\Constants::$langs
.
Esto funciona, pero dudo que sea la forma más eficiente o correcta de hacerlo. Quiero decir, ¿es la forma correcta de "propagar" una variable mediante la creación de un proveedor de servicios completo y fachadas y todo eso? ¿O dónde debería poner estos datos?
Gracias por cualquier consejo.
EDITAR # 01
Los datos que quiero pasar a todos los controladores y las vistas se pueden configurar directamente en un script, como en el ejemplo al comienzo de mi publicación, pero también se pueden generar dinámicamente, desde una base de datos, por ejemplo. Estos datos pueden ser una lista de categorías. Los necesito en todas las vistas para generar una barra de navegación, pero también los necesito para definir algunos patrones de enrutamiento (como /category/subcategory/product
), y también para analizar información en varios controladores (como obtener información de la categoría que contiene el producto X).
Mi matriz es algo como:
$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...']
]
Solo como un ejemplo. El índice es la identificación de la categoría y el valor es la información asociada con la categoría.
Necesito esta matriz, también, disponible en todos los controladores y vistas.
Entonces, ¿debería guardarlo como una variable de configuración? ¿De qué otra manera podría almacenar estos datos? ¿Cuál sería la mejor y semánticamente correcta forma?
fuente
config()
asistente en lugar de usarConfig::get()
ahora.Para constantes
Cree el archivo constants.php en el directorio de configuración: -
define('YOUR_DEFINED_CONST', 'Your defined constant value!'); return [ 'your-returned-const' => 'Your returned constant value!' ];
Puedes usarlos como: -
echo YOUR_DEFINED_CONST . '<br>'; echo config('constants.your-returned-const');
Para matrices estáticas
Cree el archivo static_arrays.php en el directorio de configuración: -
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' ]; }
Puedes usarlo como: -
echo StaticArray::$langs['en'];
Nota: Laravel incluye todos los archivos de configuración automáticamente, por lo que no es necesario incluirlos manualmente :)
fuente
route:cache
:Use of undefined constant ID - assumed 'ID'
app / constants.php
define('YOUR_CONSTANT_VAR', 'VALUE'); //EX define('COLOR_TWO', 'red');
composer.json agregue la ubicación del archivo en la carga automática en composer.json
"autoload": { "files": [ "app/constants.php" ] }
Antes de que este cambio entre en vigencia, debe ejecutar el siguiente comando en la Terminal para regenerar los archivos de carga automática de Laravel:
fuente
Para las constantes globales en Laravel 5, no me gusta llamar a Config para ellas. Los defino en el grupo de Ruta así:
// global contants for all requests Route::group(['prefix' => ''], function() { define('USER_ROLE_ADMIN','1'); define('USER_ROLE_ACCOUNT','2'); });
fuente
Creo que la mejor forma es utilizar la localización.
Cree un nuevo archivo
messages.php
enresources/lang/en
(en
porque eso es lo que está configurado en miconfig/app
'locale'=>'en'
) devuelva una matriz de todos sus valoresreturn [ 'welcome' => 'Welcome to our application' ];
para recuperar para laravel 5.3 y anteriores
echo trans('messages.welcome');
o
echo Lang::get('messages.welcome');
para uso 5.4
echo __('messages.welcome')
localización de laravel 5.0
o
localización de laravel 5.4
fuente
Solo para agregar a la respuesta anterior, tendrá que incluir la clase de configuración antes de poder comenzar a usarla en Laravel 5.3
use Illuminate\Support\Facades\Config;
fuente
Al menos en Laravel 5.4, en tu constructor puedes crearlos;
public function __construct() { \Config::set('privileged', array('user1','user2'); \Config::set('SomeOtherConstant', 'my constant'); }
Entonces puedes llamarlos así en tus métodos;
\Config::get('privileged');
Especialmente útil para métodos estáticos en el Modelo, etc ...
Referencia en Laracasts.com https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found
fuente
Simplemente coloque un archivo constants.php en el directorio de configuración y defina sus constantes en ese archivo, ese archivo se cargará automáticamente, probado en Laravel 6+
fuente