You are currently viewing Build Powerful Multi-Tenant Application using Laravel 4 and 5
vteams- blog

Build Powerful Multi-Tenant Application using Laravel 4 and 5

  • Post published:November 16, 2015

Nowadays, Multi-Tenant or SaaS based applications are all over the web. Concept behind multi-tenancy is to use single code base to serve multiple clients with same functionality. Recently, we interacted with a client who was managing several schools. He wanted to keep every school separate from one another on different sub-domains with separate databases. We built the Multi-Tenant Application using Laravel. 

To achieve the required functionality, we performed the following steps:

Step 1: Database Types

We needed a main database and several other databases for each and every school. The main database was used to manage the following instances of schools:

  • ID
  • Name
  • Domain Name
  • Theme
  • database_name
  • database_user
  • database password encoded
  • Status

If a domain name would exist in main database and had an active status then the application would proceed normally. Database would likewise be loaded as per the provided information.

Step 2: Sub-Domains

Every sub-domain would point to the same code and same folder on Server.

Step 3: Select Database

The Database would be chosen by means of a filter (Laravel 4) or middleware (Laravel 5) contingent upon the version of Laravel framework.  Every request would land on filter or middleware before reaching to any other page. To achieve this functionality, routes setup was needed.

A middleware was created where we implemented a code to check the sub-domain status if it is accessing the code (which exists in main database) or not. If the code existed in database then it would be fine or else sub-domain would be redirected to error page. The middleware example is given below:

namespace App\Http\Middleware;
use App\Sites;
use Closure;

class config
     * Handle an incoming request.
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
    public function handle($request, Closure $next)
        $site_url = $_SERVER['SERVER_NAME'];
        $site = Sites::where('site_url',$site_url)->first();

        $config = array();        

            $config['id'] = $site["id"];
            $config['site_url'] = $site["site_url"];
            $config['theme'] = $site["theme"];
            $config['host'] = $site["host"];
            $config['db_name'] = $site["database"];
            $config['user'] = $site["user"];
            $config['password'] = $site["password"];
            $config['prefix'] = $site["prefix"];
 //default values
            $config['id'] = "0";
            $config['site_url'] = "demo.local";
            $config['theme'] = "theme";
            $config['host'] = "localhost";
            $config['db_name'] = "dbname";
            $config['user'] = "username";
            $config['password'] = "password";
            $config['prefix'] = "tbl";           
        // \Session::put('config', $config);

        \Config::set('', $config['host'] );
        \Config::set('database.connections.mysql.database', $config['db_name'] );
        \Config::set('database.connections.mysql.username', $config['user']);
        \Config::set('database.connections.mysql.password', $config['password']);
        \Config::set('database.connections.mysql.prefix', $config['prefix']);

        \Config::set('database.connections.mysql.theme', $config['theme']);

        return $next($request);

Step 4: Update Routes

To use middle-ware, we had to update route as follows:

Route::group(['middleware' => 'config'],function (){
       Route::get('/', ['uses' => 'HomeController@page']);

Note: This route stated that if the application would try to access anything from the configured route then it would hit middleware and check if proper database was selected or not.


To implement multi-tenancy functionality, the only change required is to use Middleware code in a Filter.

Building a Multi-Tenant Application using Laravel

So if this article somewhere convinced you that SaaS development outsourcing is the right fit for your next product and is worth a shot, our experts at vteams would be more than happy to assist, giving you the best of both worlds.