laravel 4 – detectEnvironment dosen't work

Я пытаюсь настроить 2 среды для моего проекта laravel 4, и я просто не могу определить среду проекта.

Я вижу в исходном коде, что detectEnvironment в start.php использует:

$args = isset($_SERVER['argv']) ? $_SERVER['argv'] : null; 

но когда я dd (напечатаю), $ _SERVER ['argv'] пуст (возвращает null на live-сервере и на моей локальной машине).

мне нужно настроить кого-то?

  • имейте в виду, что мой живой сервер – это общий хост, и у меня ограниченный доступ к config.
  • я открыл dir в / config / с database.php и установил все в start.php:

,

 $env = $app->detectEnvironment(array( 'local' => array('*local*'), 'live' => array('*live*') )); 

Вот как я устанавливаю свою среду:

Создайте файл .environment в корневой папке приложения и определите среду и добавьте к ней свою конфиденциальную информацию:

 <?php return array( 'APPLICATION_ENV' => 'development', /// this is where you will set your environment 'DB_HOST' => 'localhost', 'DB_DATABASE_NAME' => 'laraveldatabase', 'DB_DATABASE_USER' => 'laraveluser', 'DB_DATABASE_PASSWORD' => '!Bassw0rT', ); 

Добавьте его в свой файл .gitignore , поэтому вы не рискуете отправить свои пароли в Github или на любой другой сервер.

Прямо перед $app->detectEnvironment в файле bootstrap/start.php загрузите файл .environment в среду PHP:

 foreach(require __DIR__.'/../.environment' as $key => $value) { putenv(sprintf('%s=%s', $key, $value)); } 

И тогда вам просто нужно использовать его:

 $env = $app->detectEnvironment(function () { return getenv('APPLICATION_ENV'); // your environment name is in that file! }); 

И он будет работать повсюду, так что вам больше не нужно иметь отдельные отделы для разработки и производства:

 <?php return array( 'connections' => array( 'postgresql' => array( 'driver' => 'pgsql', 'host' => getenv('DB_HOST'), 'database' => getenv('DB_DATABASE_NAME'), 'username' => getenv('DB_DATABASE_USER'), 'password' => getenv('DB_DATABASE_PASSWORD'), 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', ), ), ); 

Обратите внимание, что я не устанавливаю резервную копию:

 return getenv('APPLICATION_ENV') ?: 'local'; 

Потому что, если я не устанавливаю файл, я хочу , чтобы он терпел неудачу на каждом сервере, к которому я развертываю свое приложение.

Laravel использует нечто подобное, вы создаете файлы .env в корне вашего приложения:

 .env.local.php // this file will appear only in your local environment, not in production .env.staging.php // for staging .env.php // for production 

В этих файлах вы добавляете свою конфиденциальную информацию

 <?php return array( 'DB_HOST' => 'localhost', 'DB_USER' => 'root', 'DB_PASS' => '1023809182root@pass', ); 

Создайте файлы, разделенные средой:

app / config / local / database.php app / config / staging / database.php app / config / database.php

Затем в ваших файлах или в любом месте приложения вы можете получить доступ к своим конфиденциальным данным через $ _ENV или getenv ():

 $_ENV['DB_HOST'] $_ENV['DB_USER'] $_ENV['DB_PASS'] 

Пример:

 'postgresql' => [ 'driver' => 'pgsql', 'host' => 'localhost', 'database' => getenv('DB_HOST'), 'username' => getenv('DB_USER'), 'password' => getenv('DB_PASS'), 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', ], 

Но вы все равно должны установить имя среды, что может быть проблемой в вашем случае.

Не забудьте добавить эти файлы в ваш файл .gitignore, поэтому вы не рискуете отправить их в свой github.

Документация: http://laravel.com/docs/configuration#protecting-sensitive-configuration

Фактически $args = isset($_SERVER['argv']) ? $_SERVER['argv'] : null; $args = isset($_SERVER['argv']) ? $_SERVER['argv'] : null; будет работать только в том случае, если аргументы передаются скрипту при запуске из командной строки. Итак, в Laravel , если вы запустите любую команду artisan тогда все аргументы, переданные этой команде, будут доступны в $_SERVER['argv'] иначе она будет всегда NULL .

Чтобы проверить среду, вы можете использовать метод App::environment() или метод App::isLocal() для проверки локальности и для установки различных сред, которые вы можете использовать:

 $env = $app->detectEnvironment(array( // replace with your machine/host name, gethostname() will return hostname 'local' => array('your-machine-name') )); 

Или вы можете использовать что-то вроде этого:

 $env = $app->detectEnvironment(function(){ // SheikhHeera-PC is my machine name return $_SERVER['HTTP_HOST'] == 'SheikhHeera-PC' ? 'local':'production'; }); 

Подробнее о документации .