rubensrocha

Laravel Multi-Tenant Multi-Database Multi-Domain

Nov 11th, 2018
563
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. //.env
  3. APP_URL=http://app.defaultapp/
  4. MAIN_DOMAIN=app.defaultapp
  5.  
  6. //Database companies, first record
  7. domain colum = app.clientsite1
  8.  
  9. //RouteServiceProvider
  10. protected function mapTenantRoutes()
  11.     {
  12.         Route::middleware(['tenant.domain','web'])
  13.             ->namespace($this->namespace)
  14.             ->group(base_path('routes/tenant.php'));
  15.     }
  16.  
  17. //App/Htt/Kernel
  18. protected $middleware = [
  19.         \App\Http\Middleware\CheckForMaintenanceMode::class,
  20.         \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
  21.         \App\Http\Middleware\TrimStrings::class,
  22.         \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
  23.         \App\Http\Middleware\TrustProxies::class,
  24.         //Tenant
  25.         \App\Http\Middleware\Tenant\TenantMiddleware::class,
  26.         \App\Http\Middleware\Tenant\TenantFilesystems::class,
  27.     ];
  28.  
  29. protected $routeMiddleware = [
  30.         'auth' => \App\Http\Middleware\Authenticate::class,
  31.         'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
  32.         'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
  33.         'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
  34.         'can' => \Illuminate\Auth\Middleware\Authorize::class,
  35.         'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
  36.         'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
  37.         'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  38.         'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
  39.         //Tenant
  40.         'tenant.domain' => \App\Http\Middleware\Tenant\CheckMainDomain::class,
  41.         'tenant.not.domain' => \App\Http\Middleware\Tenant\NotMainDomain::class,
  42.     ];
  43.  
  44. //Http/Middleware/Tenant/TenantMiddleware
  45. public function handle($request, Closure $next)
  46.     {
  47.         $manager = app(ManagerTenant::class);
  48.         if ($manager->domainIsMain())
  49.         {
  50.             return $next($request);
  51.         }
  52.  
  53.         $company = $this->getCompany($request->getHost());
  54.        
  55.         if (!$company && $request->url() != route('404.tenant')) {
  56.             return redirect()->route('404.tenant');
  57.         } else if($request->url() != route('404.tenant') && !$manager->domainIsMain() ) {
  58.             $manager->setConnection($company);
  59.  
  60.             $this->setSessionCompany($company->only([
  61.                 'name', 'uuid',
  62.             ]));
  63.         }
  64.  
  65.         return $next($request);
  66.     }
  67.  
  68.  
  69.     public function getCompany($host)
  70.     {
  71.         return Company::where('domain', $host)->first();
  72.     }
  73.  
  74.     public function setSessionCompany($company)
  75.     {
  76.         session()->put('company', $company);
  77.     }
  78.  
  79. //App\Http\Middleware\Tenant\CheckMainDomain
  80. public function handle($request, Closure $next)
  81.     {
  82.         if ($request->getHost() != env('MAIN_DOMAIN')) {
  83.             //dd(env('MAIN_DOMAIN'));
  84.             return abort(401, 'Unauthorized access!');
  85.         }
  86.  
  87.         return $next($request);
  88.     }
  89. //App\Http\Middleware\Tenant\NotMainDomain
  90. public function handle($request, Closure $next)
  91.     {
  92.         if ($request->getHost() === env('MAIN_DOMAIN')) {
  93.             return abort(401, 'Unauthorized access!');
  94.         }
  95.  
  96.         return $next($request);
  97.     }
  98.  
  99. //Routes/tenant.php
  100. Route::group(['namespace'=>'Tenant'], function(){
  101.     Route::get('/', 'TenantController@index')->name('tenant');
  102.     Route::get('companies', 'CompanyController@index')->name('company.index');
  103.     Route::get('company/create', 'CompanyController@create')->name('company.create');
  104.     Route::post('company', 'CompanyController@store')->name('company.store');
  105.     Route::get('company/{domain}', 'CompanyController@show')->name('company.show');
  106.     Route::get('company/edit/{domain}', 'CompanyController@edit')->name('company.edit');
  107.     Route::put('company/{id}', 'CompanyController@update')->name('company.update');
  108.     Route::delete('company/{id}', 'CompanyController@destroy')->name('company.destroy');
  109. });
  110.  
  111.  
  112. ?>
Advertisement
Add Comment
Please, Sign In to add comment