php - array - select2 bootstrap laravel
Configuración de configuración dinámica de Laravel (7)
Estoy usando un paquete dentro de mi proyecto y almacena una configuración dentro de config/packagename
Me gustaría cambiar dinámicamente este valor dentro del archivo de configuración, así es como se ve actualmente la estructura del archivo;
<?php
return [
''view_id'' => ''118754561'',
''cache_lifetime_in_minutes'' => 60 * 24,
];
Me gustaría cambiarlo a algo como esto -
''view_id'' => Auth::user()->id,
¿Puedes hacer esto dentro del archivo de configuración, o tienes que almacenar algún tipo de variable que se actualizará más tarde dentro de un controlador? ¿Hay alguna forma de colocar estas variables en un archivo env y acceder a estas nuevas variables desde un controlador?
Desde Laravel v5.2 puede establecer dinámicamente los valores de configuración de esta manera :
<?php
config([''app.timezone'' => ''America/Chicago'']);
$value = config(''app.timezone'');
echo $value;
// output: ''America/Chicago''
En realidad, si usted es ese punto de código que lo obliga a hacer que los valores de configuración sean dinámicos, entonces debe haber algún problema con el flujo de código, ya que el uso del archivo de configuración solo sirve para inicializar los valores requeridos, que deben definirse antes de que la aplicación cargado.
Hacer que los valores de configuración sean dinámicos es una "MALA PRÁCTICA" en el mundo de la codificación. Entonces, existe la siguiente alternativa para su problema.
Definir el valor en el archivo .env (opcional)
VIEW_ID=your_view_id_here
Use valor dentro del controlador
$auth_id = auth()->user()->id;
$view_id = env(''VIEW_ID'', $auth_id);
// If .env file doesn''t contains ''VIEW_ID'' it will take $auth_user as the view_id
¡Espero que esto te ayude!
Esta también es una solución genérica para actualizar dinámicamente su archivo .env (respectivos pares clave / valor individuales)
- Cambia la configuración en tu configuración / nombre de paquete así:
return [ ''view_id'' => env(''VIEW_ID'', ''118754561''), etc... ]
Agregue un valor inicial en .env:
VIEW_ID = 118754561
En un controlador apropiado (por ejemplo, AuthController), use el siguiente código y llame a la función de esta manera:
updateDotEnv(''VIEW_ID'', Auth::User()->id)
protected function updateDotEnv($key, $newValue, $delim='''') { $path = base_path(''.env''); // get old value from current env $oldValue = env($key); // was there any change? if ($oldValue === $newValue) { return; } // rewrite file content with changed data if (file_exists($path)) { // replace current value with new value file_put_contents( $path, str_replace( $key.''=''.$delim.$oldValue.$delim, $key.''=''.$delim.$newValue.$delim, file_get_contents($path) ) ); } }
(El parámetro $ delim es necesario si desea que esta función sea más genérica para poder trabajar con los pares clave = valor en .env, donde el valor debe ir entre comillas dobles porque contienen espacios).
Es cierto que esta podría no ser una buena solución si tiene varios usuarios al mismo tiempo que usan este paquete en su proyecto. Entonces, depende de para qué está usando este paquete.
NB: Por supuesto, debe hacer que la función sea pública si planea usarla de otras clases.
Puedes hacer esto
En tu archivo de configuración personalizada. Agregue el siguiente código Puede enviar su id de forma dinámica desde la cadena de consulta.
''view_id'' => isset($_REQUEST[''view_id''])?$_REQUEST[''view_id'']:null,
Para obtener ID de vista
echo config(''app.view_id''); // app is config file name
Si realmente desea editar los archivos de configuración ( config/packagename.php
.env
o .env
), entonces puede seguir la respuesta de matthiku .
Sin embargo, si yo fuera usted, supongo que preferiría configurar este paquete de terceros en función de algún valor definido en tiempo de ejecución, en lugar de modificar cualquier archivo (que, por cierto, no tendrá efecto hasta la siguiente solicitud, cuando el los valores env se leen de nuevo).
Entonces, en mi opinión, la forma más limpia de hacer esto es:
almacene su valor deseado en los datos de configuración:
config([''packagename.view_id'' => Auth::user()->id]);
Sin embargo, es probable que note que esto no funcionará: el proveedor de servicios que proporciona el servicio que necesita a menudo se registra antes de que se procese la solicitud, es decir, antes de que su cambio de configuración tenga lugar. Entonces todavía está recibiendo el servicio con la configuración de valores anterior.
Entonces, ¿cómo podría hacer que se llame al proveedor de servicios solo cuando sea necesario y no antes (es decir, después de establecer el nuevo valor de configuración)? Puede convertirlo en un proveedor diferido . Siguiendo su ejemplo de "spatre laravel-analytics", reemplace en
config/app.php
esta línea:Spatie/Analytics/AnalyticsServiceProvider::class
Con este:
App/Providers/AnalyticsDeferredServiceProvider::class
y finalmente crea la clase
App/Providers/AnalyticsDeferredServiceProvider
, con:
:
<?php
namespace App/Providers;
use Spatie/Analytics/Analytics;
use Spatie/Analytics/AnalyticsServiceProvider;
class AnalyticsDeferredServiceProvider extends AnalyticsServiceProvider
{
protected $defer = true;
public function provides()
{
return [Analytics::class];
}
}
De esta forma, puede hacer que el proveedor lea los valores de configuración cuando esté a punto de instanciar el servicio, después de establecer los valores de configuración de tiempo de ejecución.
Todos los archivos de configuración de Laravel framework almacenados en el directorio app/config
.
entonces, si necesitamos crear valores de configuración personalizados, sería mejor mantener separada nuestra configuración personalizada en un archivo personalizado. entonces necesitamos crear un archivo personalizado en el app/config directory
.
Laravel auto lee este archivo como un archivo de configuración y lo administrará automáticamente. En este tema estamos trabajando con la configuración personalizada en laravel y obtendremos el valor de configuración en el controlador o en la vista.
Ahora voy a explicar cómo crear un archivo de configuración personalizado en Laravel para que podamos implementar la función dinámica a esto.
crea un archivo en app/config/custom.php
que tenga claves de configuración y valor como: -
return array(
''my_val'' => ''mysinglelue'',
''my_arr_val'' => array(''1'', ''2'', ''3''),
);
Ahora necesitamos obtener estos valores de configuración en view / controller, entonces usaremos el método de la clase Config get()
para esto
Sintaxis:
echo Config::get(''filename.arraykey'');
donde filename
es el config file''s name
, personalizado en nuestro caso, y la clave es la array key
del valor al que desea acceder.
En nuestro caso será como:
echo Config::get(''custom.my_val'');
Crear configuración de tiempo de ejecución en laravel: -
Los valores de configuración que se configuran en tiempo de ejecución se establecerán para la solicitud actual, no se transferirán a solicitudes posteriores.
Puede pasar los valores dinámicos aquí para que pueda modificar el archivo de configuración de forma dinámica utilizando las funciones
isset()
.
Al igual que el @Kundan roy como sugirió el uso del isset()
aplica la misma condición aquí. Pero este es el método alternativo que funcionará para la configuración dinámica de los valores en la configuración.
Config::set(''custom.my_val'', ''mysinglelue'');
Por lo tanto, al usar este método, puede crear los archivos de configuración dinámica en función de los valores que necesita.
Use esto en el controlador cuando necesite cambiar.
<?php
use Illuminate/Support/Facades/Config;
//[...]
$user_id = Auth::user()->id;
Config::set(''view_id'', $user_id );