Thursday, March 30, 2017

Laravel 5.4: Change DB according to sub domain in laravel

I am creating a SAAS application with a single laravel installation and multi tenant database. So i have a main DB that is connected to laravel by default. the client can access the application through their sub-domain like: client1.example.com and client2.example.com

I am saving all info fo the client like domain and db name in the main db.

How can change the DB according to the subdomain

I tried with the following Code

in routes/web.php

Route::group(['domain' => '{account}'], function() {
    Route::get('/', function($account) {
        // This will return {account}, which you can pass along to what you'd like
        return $account;
    });

});

in app/Providers\RouteServiceProvieder.php

 public function boot(Router $router)
    {
        parent::boot($router);

        $router->bind('domain', function ($value) {
            //$hst=$request->getHost();
            $domain= Customer::where('sub_domain',$value)->first();
            if ($domain) {
                return $domain;
            }
            throw new Exception('error message');
        });

    }

Then i have created a ServiceProvider ConfigServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Request;

class ConfigServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register(Request $request)
    {
        $customer=$request->route('domain');
        //$customer = Request::route('domain');  // there are multiple ways of doing this
        //$customer = $request->route()->domain;
        config([
            'database.mysql.database' => $customer->customer_database,  //this is because I have same username and password for all the databases. If you have different username and passwords set them too.
        ]);
        DB::reconnect(); // this will help in reconnecting the database if the connection is already established. and import the DB facade.
    }
}

But the code is not working?

The Error i am getting is

FatalThrowableError in ConfigServiceProvider.php line 25:
Type error: Too few arguments to function App\Providers\ConfigServiceProvider::register(), 0 passed in C:\xampp\htdocs\main\vendor\laravel\framework\src\Illuminate\Foundation\Application.php on line 568 and exactly 1 expected

I am using Laravel 5.4. Can any one guide me how to do it correctly?



via mohit

Advertisement