Ustawienia baz danych oparte na środowisku w Laravel?
Przechodzę przez framework Laravel, ale mam problem z ustawieniami bazy danych,
W szczególności mam skonfigurowane środowiska i działają one dobrze dla aplikacji.plik konfiguracyjny php, jednak baza danych.plik konfiguracyjny php wydaje się nie mieć żadnego wpływu.
Nawet jeśli mam bazę danych.plik konfiguracyjny php w moim folderze environments nigdy nie jest ładowany, włożyłem kilka nieprawidłowych znaków (mash klawiatury) do pliku, aby PHP wyrzucił błąd, ale nigdy nie jest hit.
Czy Laravel nie obsługuje ustawień bazy danych opartych na środowisku? czy robię to źle?
10 answers
Możesz definitywnie ustawić ustawienia bazy danych (i inne ustawienia konfiguracyjne)według środowiska.
Dla Laravel 3 (dla Laravel 4 i Laravel 5 patrz poniżej):
Po pierwsze-musisz zdefiniować $environments
w swoim paths.php
i ustawić na coś takiego:
$environments = array(
'development' => array('*.dev'),
'production' => array('*.com'),
);
Laravel będzie automatycznie szukać tej zmiennej, a jeśli jest ustawiona, użyje powiązanej konfiguracji.
Normalnie masz config
folder z ustawieniami takimi jak database.php
i auth.php
Teraz po prostu utwórz nowy folder dla każdego Laravel_Env
, którego planujesz użyć(np. Będziesz miał taką strukturę folderów;
/application
/config
/development
database.php
/production
database.php
application.php
config.php
database.php
...
user_agents.php
Zauważ, że dodałem tylko database.php
do każdego podfolderu. Laravel zawsze najpierw załaduje domyślne ustawienia konfiguracyjne, a następnie nadpisze je dowolnymi niestandardowymi konfiguracjami z ustawienia środowisk.
W końcu, w pliku development/database, będziesz miał coś takiego;
<?php
return array(
'default' => 'mysql'
);
p. s. ja tylko przetestowałem to na obecnej kompilacji 3.2.12 Laravel - i to na pewno działa.
Wskazówka dodatkowa: Możesz również automatycznie ustawić środowisko dla Artisan, więc nie musisz dołączać środowiska ręcznie do każdego wiersza poleceń! Aby to zrobić:
Musisz znać swoją "nazwę hosta", na której używasz Artisan. Aby się dowiedzieć-tymczasowo edytuj
artisan.php
w folderze głównym i dodajvar_dump(gethostname());
do linii 2 (tj. powyżej wszystko).Uruchom
php artisan
z linii poleceń. Otrzymasz zrzut ciągów z nazwą hosta. W moim przypadku to "Tse-Win7";-
Usuń zmiany w pliku
artisan.php
Dodaj swoją nazwę hosta (np. "TSE-Win7") do środowisk.
Powinieneś skończyć z czymś takim:
$environments = array(
'development' => array('*.dev', 'TSE-Win7'),
'production' => array('*.com'),
);
Artisan będzie teraz uruchamiany przy użyciu Twojego środowiska programistycznego. Jeśli wdrożysz na serwerze aktywnym - wykonaj ponownie te kroki, aby uzyskać hostname() dla serwera i możesz skonfigurować konkretny Artisan config tylko dla serwera!
Dla Laravel 4:
Domyślnym środowiskiem jest zawsze production
. Ale w Twoim początku.plik php można zdefiniować dodatkowe środowiska.
$env = $app->detectEnvironment(array(
'local' => array('your-machine-name'),
));
Na Linuksie i Macu możesz określić swój hostname
przez typ hostname
w terminalu - wyświetli nazwę Twojego komputera. W systemie Windows umieść dd(gethostname());
na początku pliku routes.php
- i uruchom stronę raz-pokaże Ci aktualną nazwę hosta twojego komputera.
Aby uzyskać bieżące środowisko jako zmienną w swojej aplikacji - przeczytaj to więc odpowiedz tutaj. Laravel 4: Jak mogę uzyskać wartość środowiska?
Dla Laravel 5:
W katalogu głównym znajduje się pojedynczy plik konfiguracyjny o nazwie .env
.
obejrzyj ten laracast , Config wyjaśnione w pełni.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:24
Jeśli używasz artisan (wiersz poleceń dla laravel ) każde polecenie musisz dodać
artisan bla bla bla --env=Development
Lub
artisan bla bla bla --env=Production
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-15 14:02:22
[[2]} Oto Jak mam to ustawione dla moich potrzeb.
Osobiście potrzebuję 4 różnych konfiguracji:
- dev.my-domain.com (VPS)-/var/www/my-domain.com/development /
- test.my-domain.com (VPS)-/var/www/my-domain.com/test /
- my-domain.com (VPS)-/var/www/my-domain.com/web /
Ponieważ wszystkie 4 moje środowiska mają charakterystyczną strukturę katalogów, mogę użyj magicznej stałej php _ _ DIR _ _ , Aby pobrać katalog aplikacji, a następnie użyj funkcji strpos () , aby wykonać proste sprawdzenie i zwrócić odpowiednie środowisko. Zajmie się również środowiskiem rzemieślniczym, nie trzeba ręcznie wpisywać środowiska ani dodawać żadnych nazw maszyn.
Wewnątrz
Bootstrap/start.php
Dodaj funkcję wywołania zwrotnego
$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
});
Inna alternatywa
Możemy również ustawić i pobrać wszystkie wartości w raz do tablicy i uruchom pętlę foreach.
Wskazówka: ponieważ używamy funkcji strpos () , która sprawdza pozycję pierwszego wystąpienia podanej wartości względem $stóg siana i zwraca numer pozycji. Tak naprawdę nie musimy dostarczać całej ścieżki, możemy po prostu dodać wyróżniającą wartość z każdej ścieżki, aby wykonać zadanie.
// 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;
}
Niezależnie od tego, czy pracujemy na jednej maszynie, czy na wielu, szanse na to, że będziemy mieli tę samą drogę do różnych środowisko jest bardzo smukłe.
Tak mi się wydaje. :)Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-07 05:45:08
Jak skonfigurować konfigurację specyficzną dla środowiska jest teraz w oficjalnych dokumentach Laravel. Polecam użycie ich metody zamiast zaakceptowanej odpowiedzi:
Często pomocne jest posiadanie różnych wartości konfiguracyjnych opartych na środowisko, w którym uruchomiona jest aplikacja. Na przykład, możesz chcesz użyć innego sterownika pamięci podręcznej na lokalnej maszynie programistycznej niż na serwerze produkcyjnym. Jest to łatwe do osiągnięcia za pomocą Ochrona środowiska konfiguracja.
Po prostu utwórz folder w katalogu config, który pasuje do twojego nazwa środowiska, np. lokalnego. Następnie utwórz pliki konfiguracyjne chcesz nadpisać i określić opcje dla tego środowiska. Na przykład, aby nadpisać sterownik pamięci podręcznej dla środowiska lokalnego, można utworzy bufor.plik php w app / config / local z następującym treść:
<?php
return array(
'driver' => 'file',
);
Uwaga: nie używaj 'testing' jako nazwy środowiska. To jest reserved do testów jednostkowych. Zauważ, że nie musisz podawać każdej opcji to jest w podstawowym pliku konfiguracyjnym, ale tylko opcje, które chcesz aby obejść. Pliki konfiguracyjne środowiska będą "kaskadowe" nad akta bazy.
Następnie musimy poinstruować framework, jak określić, które środowisko, w którym działa. Domyślnym środowiskiem jest zawsze produkcja. Można jednak skonfigurować Inne Środowiska w bootstrap / start.plik php w katalogu głównym twoja instalacja. W tym plik znajdziesz wywołanie $app - >detectEnvironment. Tablica przeszła do tej metody służy określenie bieżącego środowiska. Możesz dodaj Inne Środowiska i nazwy maszyn do tablicy w razie potrzeby.
<?php
$env = $app->detectEnvironment(array(
'local' => array('your-machine-name'),
));
W tym przykładzie 'local' to nazwa środowiska i 'your-machine-name' to nazwa hosta twojego serwera. Na Linuksie i Macu, nazwę hosta można określić za pomocą polecenia Terminal hostname.
Jeśli potrzebujesz bardziej elastycznego wykrywania środowiska, możesz przejść Zamknięcia do metody detektywistycznej, pozwalającej na wdrożenie wykrywanie środowiska W DOWOLNY SPOSÓB:
$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;
}
});
Możesz uzyskać dostęp do bieżącego środowiska aplikacji poprzez środowisko "metoda": {]}
Dostęp Do Bieżącego Środowiska Aplikacji
$environment = App::environment();
Możesz również przekazać argumenty do metody środowiskowej, aby sprawdzić, czy środowisko odpowiada danemu wartość:
if (App::environment('local'))
{
// The environment is local
}
if (App::environment('local', 'staging'))
{
// The environment is either local OR staging...
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-08 17:08:54
Laravel 5
Użyj metody DotEnv opisanej w dokumentach Laravel tutaj .
Laravel 4
Stosujemy metodę zalecaną w tej lekcji laracasts .
-
Tworzenie
config
katalogów dla każdego środowiska./app /config /local database.php /production database.php
-
Ustaw zmienną środowiskową na serwerze produkcyjnym. Google dla najlepszego podejścia na swojej platformie produkcyjnej. Na przykład tutaj są świetne propozycje dla Ubuntu, Dreamhost i Heroku . Dodaliśmy jedną linię do
/etc/environment
:ENV=production
-
Dodaj to zamknięcie do
/bootstrap/start.php
. Po tej konfiguracji każdy serwer, który nie posiada zmiennej środowiskowejENV
, będzie domyślnie konfiguracją środowiskowąlocal
.$env = $app->detectEnvironment( function () { return getenv('ENV') ? : 'local'; } );
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:36
Pracowałem nad tym dzisiaj, walcząc o to, jak najlepiej zrobić ustawienia środowiskowe dla bazy danych. W końcu, po wypróbowaniu kilku metod, w pełni zgadzam się z @troy-harvey, że rekomendacja Jeffreya Way ' a jest najlepsza (przynajmniej dla mnie). Jedną rzeczą, którą dodam do tego, a jej to, co mnie tak dziś trzymało, jest (i popraw mnie, jeśli się mylę ), że musisz uzyskać dostęp do ustawień, które próbujesz przesadzić w swoim pliku ustawień środowiskowych przez ich odpowiednie klucze tablicy. Zacząłem zwracać prostą tablicę:
return [
'database' => '<db_name>',
'username' => '<db_user>',
'password' => '<db_pass>',
];
W obrębie app/config/staging/database.php
. To nie miało żadnego wpływu i po wielu drapaniu głowy zdałem sobie sprawę, że musisz uzyskać dostęp do tablicy, jak to jest przedstawione w app/config/database.php
, Jak tak:
<?php
return [
'connections' => [
'mysql' => [
'database' => '<db_name>',
'username' => '<db_user>',
'password' => '<db_pass>'
]
]
];
Przynajmniej tak w końcu udało mi się odebrać moje ustawienia.
Dodaję to tutaj na wypadek, gdyby ktoś inny miał problemy z rozpracowaniem tego. Po zrealizowaniu zrozumiałam, jak oczywisty był błąd, który popełniłam.
Edytowano 01 Lipiec 2014
Dodatkowym komentarzem jest to, że od wersji 4.1 Laravel jest wyposażony w funkcję pomocniczą append_config () do dołączania konfiguracji środowiska do głównej tablicy konfiguracyjnej.
Wyglądałoby to tak dla przykładu podanego powyżej:
<?php
return append_config([
'connections' => [
'mysql' => [
'database' => '<db_name>',
'username' => '<db_user>',
'password' => '<db_pass>'
]
]
]);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-01 11:07:49
W Laravel 3 do wykrywania środowiska było:
Request:env()
Który zwróci to, co zostało zidentyfikowane w tablicy środowisk znalezionej w ścieżkach.plik php.
Jak wspomniano wcześniej w Laravel 4 jest teraz:
App:: environment()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-10 18:30:02
Mój sposób na to!
$env = $app->detectEnvironment( function() {
if ( file_exists('../.env.local.php') ) {
return 'local';
}
if ( file_exists('../.env.beta.php') ) {
return 'beta';
}
return 'production';
} );
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-23 13:28:06
Jeśli próbujesz użyć Laravel w środowisku Windows, sprawdź ustawienia w pliku .env w folderze najwyższego poziomu dla Twojego projektu Laravel - te nadpiszą wszelkie ustawienia bazy danych, które masz w config / database.php
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-08 16:19:27
Jeśli jesteś na Laravel 4 Oto gist , który przeprowadzi Cię przez proces krok po kroku. / Align = "center"bgcolor =" # e0ffe0 " / cesarz chin / / align = center /
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-20 14:19:28