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?

Author: Hailwood, 2012-12-13

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ć:

  1. Musisz znać swoją "nazwę hosta", na której używasz Artisan. Aby się dowiedzieć-tymczasowo edytuj artisan.php w folderze głównym i dodaj var_dump(gethostname()); do linii 2 (tj. powyżej wszystko).

  2. Uruchom php artisan z linii poleceń. Otrzymasz zrzut ciągów z nazwą hosta. W moim przypadku to "Tse-Win7";

  3. Usuń zmiany w pliku artisan.php

  4. 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.

 64
Author: Laurence,
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
 8
Author: Knight,
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:

    to strona internetowa, na której można znaleźć wiele ciekawych i ciekawych informacji.]}
  1. dev.my-domain.com (VPS)-/var/www/my-domain.com/development /
  2. test.my-domain.com (VPS)-/var/www/my-domain.com/test /
  3. 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. :)
 4
Author: Faiyaz Haider,
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...
}
 2
Author: Justin,
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 środowiskowej ENV, będzie domyślnie konfiguracją środowiskową local.

    $env = $app->detectEnvironment(
        function () {
            return getenv('ENV') ? : 'local';
        }
    );
    
 2
Author: Troy Harvey,
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>'
        ]
      ]
   ]);

 1
Author: Schneidey,
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()
 0
Author: Robert Brisita,
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';
} );
 0
Author: Abi Xalmon,
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

 0
Author: Phil Pearce,
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 /

 0
Author: TechyTimo,
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