produccion poner migraciones archivo php database environment laravel

php - poner - Configuración de base de datos impulsada por el entorno en Laravel?



migraciones laravel (10)

Laravel 5

Use el enfoque DotEnv detallado en los documentos de Laravel aquí .

Laravel 4

Estamos utilizando el método recomendado por Jeffrey Way en esta lección de Laracasts .

  • Crea directorios de config para cada entorno .

    /app /config /local database.php /production database.php

  • Establezca una variable de entorno en su servidor de producción. Busque el mejor enfoque en su plataforma de producción. Por ejemplo, aquí hay grandes sugerencias para Ubuntu , Dreamhost y Heroku . Agregamos una sola línea a /etc/environment :

    ENV=production

  • Agregue este cierre a /bootstrap/start.php . Con esta configuración, cualquier servidor que no tenga la variable de entorno ENV se establecerá de forma predeterminada en la configuración del entorno local .

    $env = $app->detectEnvironment( function () { return getenv(''ENV'') ? : ''local''; } );

Me estoy moviendo sobre el marco de Laravel, pero estoy teniendo problemas con la configuración de la base de datos,

Específicamente, tengo la configuración de mis entornos, y están funcionando bien para el archivo de configuración application.php, sin embargo, el archivo de configuración database.php parece no tener ningún efecto.

Incluso si tengo un archivo de configuración database.php en mi carpeta de entornos nunca se carga, pongo un montón de caracteres no válidos (mash de teclado) en el archivo para que php arroje un error, pero nunca se golpea.

¿Laravel no es compatible con la configuración de base de datos basada en el entorno? o estoy haciendo esto mal?


¡Mi forma de hacerlo!

$env = $app->detectEnvironment( function() { if ( file_exists(''../.env.local.php'') ) { return ''local''; } if ( file_exists(''../.env.beta.php'') ) { return ''beta''; } return ''production''; } );


Definitivamente puede establecer la configuración de la base de datos (y cualquier otra configuración) por medio del entorno.

Para Laravel 3 (para Laravel 4 y Laravel 5 ver a continuación):

En primer lugar, necesita definir $environments en su paths.php y configurarlo de la siguiente manera:

$environments = array( ''development'' => array(''*.dev''), ''production'' => array(''*.com''), );

Laravel buscará automáticamente esta variable, y si está configurada, usará la configuración asociada.

Normalmente tiene una carpeta de config , con configuraciones tales como database.php y auth.php

Ahora solo crea una nueva carpeta para cada Laravel_Env que planeas usar (como Desarrollo). Terminará con una estructura de carpetas como esta;

/application /config /development database.php /production database.php application.php config.php database.php ... user_agents.php

Notarás que solo he incluido database.php en cada subcarpeta. Laravel siempre cargará primero la configuración de configuración predeterminada y luego la anulará con cualquier configuración personalizada desde la configuración de entornos.

Finalmente, en su archivo de desarrollo / base de datos, tendría algo como esto;

<?php return array( ''default'' => ''mysql'' );

PD: Acabo de probar esto en la versión 3.2.12 actual de Laravel, y definitivamente funciona.

Sugerencia de bonificación: también puede establecer automáticamente un entorno para Artisan, por lo que no tiene que incluir el entorno manualmente en cada línea de comando. Para hacer esto:

  1. Necesitas saber tu ''nombre de host'' en el que estás ejecutando Artisan. Para averiguarlo, edite el artisan.php temporalmente en su carpeta raíz y agregue var_dump(gethostname()); a la línea 2 (es decir, por encima de todo).

  2. Ejecute php artisan desde la línea de comando. Obtendrá un volcado de cadena con su nombre de host. En mi caso es "TSE-Win7";

  3. Elimine los cambios en el archivo artisan.php

  4. Agregue su nombre de host (es decir, "TSE-Win7") a los entornos.

Deberías terminar con algo como esto:

$environments = array( ''development'' => array(''*.dev'', ''TSE-Win7''), ''production'' => array(''*.com''), );

Artisan ahora se ejecutará utilizando su entorno de desarrollo. Si implementa en un servidor en vivo, vuelva a ejecutar estos pasos para obtener el nombre de host () para el servidor, y puede configurar una configuración artesanal específica solo para el servidor.

Para Laravel 4:

El entorno predeterminado es siempre production . Pero en su archivo start.php puede definir entornos adicionales.

$env = $app->detectEnvironment(array( ''local'' => array(''your-machine-name''), ));

En Linux y Mac, puede determinar su hostname de hostname por tipo de hostname de hostname en su terminal: dará como resultado el nombre de su computadora. En Windows ponga dd(gethostname()); al comienzo de su archivo routes.php , y ejecute el sitio web una vez, le mostrará el nombre de host actual de su computadora.

Para obtener el entorno actual como una variable en su aplicación , lea esta respuesta SO aquí. Laravel 4: ¿cómo puedo obtener el valor del medio ambiente?

Para Laravel 5:

Hay un archivo de configuración único, llamado .env en su directorio raíz. Mira este laracast , config explicado completamente.


En Laravel 3 para detectar el entorno, fue:

Request:env()

Lo cual devolvería lo que se identificó en la matriz de entornos encontrada en el archivo paths.php.

Como se mencionó anteriormente en Laravel 4, ahora es:

App:: environment()


He estado trabajando en esto hoy, luchando por encontrar la mejor manera de hacer ajustes ambientales para una base de datos. Al final, después de probar varios métodos, estoy totalmente de acuerdo con @ troy-harvey en que la recomendación de Jeffrey Way de hacer esto es la mejor (al menos para mí). Una cosa que añadiré a esto, y es lo que me detuvo tanto hoy es ( y corríjame si me equivoco ) que necesita acceder a la configuración que está tratando de anular en su archivo de configuración ambiental por su correspondiente teclas de matriz Empecé devolviendo una matriz simple:

return [ ''database'' => ''<db_name>'', ''username'' => ''<db_user>'', ''password'' => ''<db_pass>'', ];

dentro de una app/config/staging/database.php . Esto no tuvo ningún efecto y después de mucho scratching se dio cuenta de que necesita acceder a la matriz tal como se presenta en app/config/database.php , así:

<?php return [ ''connections'' => [ ''mysql'' => [ ''database'' => ''<db_name>'', ''username'' => ''<db_user>'', ''password'' => ''<db_pass>'' ] ] ];

Al menos así es como finalmente logré que mi configuración se recogiera.

Agregando esto aquí en caso de que alguien más esté luchando para resolver esto. Al darme cuenta entendí cuán obvio era un error que estaba cometiendo.

Editado 01 de julio de 2014

Un comentario adicional a esto es que 4.1 Laravel se envía con una función de ayuda append_config () para anexar configuraciones ambientales a la matriz de configuración principal.

Esto se vería así para el ejemplo anterior:

<?php return append_config([ ''connections'' => [ ''mysql'' => [ ''database'' => ''<db_name>'', ''username'' => ''<db_user>'', ''password'' => ''<db_pass>'' ] ] ]);


Heres cómo lo tengo configurado para mis necesidades.

Personalmente necesito 4 configuraciones diferentes:

  1. localhost (Mac OSX) - /Library/WebServer/Documents/www/my-domain.com/development/
  2. dev.my-domain.com (VPS) - /var/www/my-domain.com/development/
  3. test.my-domain.com (VPS) - /var/www/my-domain.com/test/
  4. my-domain.com (VPS) - /var/www/my-domain.com/web/

Dado que los 4 de mis entornos tienen una estructura de directorio distintiva, puedo usar la constante mágica de php __DIR__ para buscar el directorio de la aplicación y luego usar la función strpos () para hacer una simple comprobación y devolver el entorno apropiado. También se ocupará del entorno Artisan, sin necesidad de escribir manualmente el entorno ni agregar ningún nombre de máquina.

Dentro de

bootstrap / start.php

Agregar una función de devolución de llamada

$env = $app->detectEnvironment(function(){ $haystack = __DIR__; // Catch the directory path // Set the booleans (remove the first ''/'', else strpos() will return 0) $isLocal = strpos($haystack, ''Library/WebServer/Documents/www/my-domain.com/development/''); $isDevelopment = strpos($haystack, ''var/www/my-domain.com/development/''); $isTest = strpos($haystack, ''var/www/my-domain.com/test/''); $isProduction = strpos($haystack, ''var/www/my-domain.com/web/''); // Set the environments if ($isLocal) $environment = "local"; if ($isDevelopment) $environment = "development"; if ($isTest) $environment = "test"; if ($isProduction) $environment = "production"; // Return the appropriate environment return $environment });

Otra alternativa

También podemos establecer y tomar todos los valores a la vez en una matriz, y ejecutar un bucle foreach.

Consejo: Ya que usamos la función strpos () , que verifica la posición de la primera ocurrencia del valor dado contra $ haystack , y devuelve el número de posición. Realmente no tenemos que suministrar toda la ruta, simplemente podemos agregar un valor distintivo de cada ruta para hacer el trabajo.

// Check the boolean, if true set to given value, else set NULL $environments[] = strpos($haystack, "Library") ? ''local'' : NULL; $environments[] = strpos($haystack, "develop") ? ''development'': NULL; $environments[] = strpos($haystack, "test") ? ''test'' : NULL; $environments[] = strpos($haystack, "web") ? ''production'' : NULL; // Loop through each, if not null then we have our environment foreach ($environments as $environment) { if(!is_null($environment)) return $environment; }

Ya sea que trabajemos en una sola máquina o en varias, las posibilidades de tener la misma ruta a diferentes entornos son muy escasas.

O eso creo. :)


Si está en Laravel 4, aquí hay una esencia que lo guiará paso a paso en el proceso. Créditos a la respuesta de @ "The Shift Exchange" por guiarme a crearlo.


Si está intentando usar Laravel en un entorno Windows, consulte las configuraciones en el archivo .env en la carpeta de nivel superior para su proyecto Laravel; esto anulará las configuraciones de base de datos que tenga en config / database.php.


si está utilizando el artesano (línea de comando para laravel) cada comando que necesita agregar

artisan bla bla bla --env=Development

o

artisan bla bla bla --env=Production


Cómo configurar la configuración específica del entorno ahora está en los documentos oficiales de Laravel. Yo recomendaría usar su método en lugar de la respuesta aceptada:

A menudo es útil tener diferentes valores de configuración basados ​​en el entorno en el que se ejecuta la aplicación. Por ejemplo, puede desear usar un controlador de caché diferente en su máquina de desarrollo local que en el servidor de producción. Es fácil lograr esto usando una configuración basada en el entorno.

Simplemente cree una carpeta dentro del directorio de configuración que coincida con el nombre de su entorno, como local. A continuación, cree los archivos de configuración que desea anular y especifique las opciones para ese entorno. Por ejemplo, para anular el controlador de caché para el entorno local, crearía un archivo cache.php en la aplicación / config / local con el siguiente contenido:

<?php return array( ''driver'' => ''file'', );

Nota: No use ''testing'' como nombre de entorno. Esto está reservado para pruebas unitarias. Tenga en cuenta que no tiene que especificar todas las opciones que se encuentran en el archivo de configuración base, sino solo las opciones que desea anular. Los archivos de configuración del entorno "en cascada" sobre los archivos base.

A continuación, debemos indicarle al marco cómo determinar en qué entorno se está ejecutando. El entorno predeterminado siempre es de producción. Sin embargo, puede configurar otros entornos dentro del archivo bootstrap / start.php en la raíz de su instalación. En este archivo, encontrará una llamada $ app-> detectEnvironment. La matriz pasada a este método se usa para determinar el entorno actual. Puede agregar otros entornos y nombres de máquinas a la matriz según sea necesario.

<?php $env = $app->detectEnvironment(array( ''local'' => array(''your-machine-name''), ));

En este ejemplo, ''local'' es el nombre del entorno y ''your-machine-name'' es el nombre de host de su servidor. En Linux y Mac, puede determinar su nombre de host utilizando el comando de terminal de nombre de host.

Si necesita una detección de entorno más flexible, puede pasar un Cierre al método detectEnvironment, lo que le permite implementar la detección del entorno como lo desee:

$env = $app->detectEnvironment(function() { $domain = explode(''.'', $_SERVER[''HTTP_HOST'']); switch($domain[0]) { case ''localhost'': case ''localhost:8080'': case ''dev'': return ''development''; break; case ''mysite'': default: return ''production''; break; } });

Puede acceder al entorno de aplicación actual a través del método de entorno:

Accediendo al entorno de aplicación actual

$environment = App::environment();

También puede pasar argumentos al método de entorno para verificar si el entorno coincide con un valor dado:

if (App::environment(''local'')) { // The environment is local } if (App::environment(''local'', ''staging'')) { // The environment is either local OR staging... }