djoo
djoo

Reputation: 695

Laravel route works with subdomain in 2 environments

I'm coding a platform to generate sub-websites.

I have a route like this who works very well in local :

//Website
Route::domain('{slug}.domain.test')->group(function () {
    Route::get('/','WebsitesController@show')->name('web_website_show');
});

I want to be able to make it works as well in production (other domain), so i did :

//Website
Route::domain('{slug}.{domain}')->group(function () {
    Route::get('/','WebsitesController@show')->name('web_website_show');
});

And in my template :

<a href="{{ route('web_website_show',['slug' => $website->slug, 'domain' => Request::getHost() ]) }}">Website</a>

The generated URL looks amazing, but the routing doesn't work and bring me to the parent page of the main domain.

What i am doing wrong ?

Thanks

Upvotes: 1

Views: 1120

Answers (2)

Erubiel
Erubiel

Reputation: 2972

If you are using laravel homestead, you'll need to register every subdomain on the etc/hosts file and on Homestead.yaml, as you probably did with the main domain. Now, I'll recommend the structure:

app.test
subdomain1.app.test
subdomain2.app.test

I wouldn't recommend to use something like:

subdomain1.app1.test
subdomain2.app2.test

I mean, you could, but it doesn't make much sense, and you would also have to register all of this on your Homestead/Local and Production environments.

For the approach that I suggest, you could set up this on an environment variable. https://laravel.com/docs/6.x/configuration#environment-variable-types

You can add any env variable you want/need to the .env file, there's an APP_URL variable, but this includes the http protocol, you could add something like:

APP_DOMAIN=app.test

And for production

APP_DOMAIN=yourapp.com

Then on the routes file access it with the helper method env, you can omit the second parameter, or use it to setup a default value, in case you forget to put it on the .env file.

Route::domain('{slug}.' . env('APP_DOMAIN', 'default.com'))->group(function () {
    Route::get('/','WebsitesController@show')->name('web_website_show');
});

BTW, this might be of help for setting up your slug value with named routes: Setting up named routes within a subdomain group in Laravel 5.7

Upvotes: 1

Martin Bean
Martin Bean

Reputation: 39399

Working with domain routes like this is a little bit of a pain in Laravel.

In an application recently, I parsed the domain part from the application URL and then set it as a configuration value like this:

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        config([
            'app.domain' => parse_url(config('app.url'), PHP_URL_HOST),
        ]);
    }
}

You can then use that in your domain routes:

Route::domain('{slug}.'.config('app.domain'), function () {
    // Subdomain routes that work in all environments
});

Upvotes: 2

Related Questions