Я пытаюсь настроить 2 среды для моего проекта laravel 4, и я просто не могу определить среду проекта.
Я вижу в исходном коде, что detectEnvironment в start.php использует:
$args = isset($_SERVER['argv']) ? $_SERVER['argv'] : null;
но когда я dd (напечатаю), $ _SERVER ['argv'] пуст (возвращает null на live-сервере и на моей локальной машине).
мне нужно настроить кого-то?
,
$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'; });
Подробнее о документации .