Reputation: 11359
I have written a backend in Laravel which I need to deploy twice on the same physical server. I need to use two different databases for these, but as they are on the same server I cannot use the built-in host detection in Laravel.
For the moment, I have "fixed" the issue by wrapping my configuration files in this code:
if ($_SERVER["HTTP_HOST"] === "example.com") {
return config array...
} else if ($_SERVER["HTTP_HOST"] === "example.net") {
return config array...
}
But this breaks artisan, so no more php artisan down|up
or php artisan cache:clear
.
There must be a better way to achieve this, no?
Upvotes: 0
Views: 506
Reputation: 5685
By default Laravel uses your hostname, as you say - however you can also pass a closure to the detectEnvironment
method to use more complex logic to set your environment.
Something like this, for example:
$env = $app->detectEnvironment(function()
{
// if statements because staging and live used the same domain,
// and this app used wildcard subdomains. you could compress this
// to a switch if your logic is simpler.
if (isset($_SERVER['HTTP_HOST']))
{
if (ends_with($_SERVER['HTTP_HOST'], 'local.dev'))
{
return 'local';
}
if (ends_with($_SERVER['HTTP_HOST'], 'staging.server.com'))
{
return 'staging';
}
if (ends_with($_SERVER['HTTP_HOST'], 'server.com'))
{
return 'production';
}
// Make sure there is always an environment set.
throw new RuntimeException('Could not determine the execution environment.');
}
});
This doesn't deal with artisan, however - HTTP_HOST
won't be set there. If the different sites are running under different users you can do another separate switch statement using $_SERVER['USER']
for example. If not you could also use the path of the install as a way to differentiate.
Upvotes: 2