Content Source:
How to develop multi tenant application using Laravel
If you want to run multiple websites using the same Laravel installation while keeping tenant specific data separated for fully independent multi-domain setups then it is pretty easily possible with this multi-tenant Laravel package.
With this package, you can serve multiple websites each with one or more hostnames from the same codebase. It has clear separation of database, assets & it also provides the ability to override logic per tenant.
This is suitable for marketing companies or startups which are building Software as a Service(SaaS).
I know this architecture is opposite to famous micro-service architecture, but just posting it in case someone is in the need to do so.
This package offers following features under the hood:
- Integration with the awesome Laravel framework.
- Event driven, extensible architecture.
- Close – optional – integration into the web server.
- The ability to add tenant specific configs, code, routes etc.
Database separation methods:
- One system database and separated tenant databases (default).
- Table prefixed in the system database.
- Or manually, the way you want, by listening to an event.
Requirements, recommended environment:
- Latest stable and LTS Laravel versions.
- PHP 7+.
- Apache or Nginx.
- MySQL, MariaDB or PostgreSQL.
Installation
composer require hyn/multi-tenant
Automatic service registration
Using auto discovery, the tenancy package will be auto detected by Laravel automatically.
Manual service registration
In case you want to disable webserver integration or prefer manual integration, set the dont-discover
in your application composer.json, like so:
{ "extra": { "laravel": { "dont-discover": [ "hyn/multi-tenant" ] } } }
If you disable auto-discovery you are able to configure the providers by yourself.
Register the service provider in your config/app.php:
'providers' => [ // [..] // Hyn multi tenancy. Hyn\Tenancy\Providers\TenancyProvider::class, // Hyn multi tenancy webserver integration. Hyn\Tenancy\Providers\WebserverProvider::class, ],
Deploy configuration
First publish the configuration and migration files so you can modify it to your needs:
php artisan vendor:publish --tag tenancy
Open the config/tenancy.php
and config/webserver.php
file and modify to your needs.
Make sure your system connection has been configured in database.php
. In case you didn’t override the system connection name the default
connection is used.
Now run:
php artisan migrate --database=system
This will run the required system database migrations.
Testing
Run tests using:
vendor/bin/phpunit
If using MySQL, use:
LIMIT_UUID_LENGTH_32=1 vendor/bin/phpunit
Please be warned running tests will reset your current application completely, dropping tenant and system databases and removing the tenancy.json file inside the Laravel directory.
For more Information and to build a website using Laravel, Hire Laravel Developer from us as we give you a high-quality product by utilizing all the latest tools and advanced technology. E-mail us any clock at – hello@hkinfosoft.com or Skype us: “hkinfosoft“.To develop the custom website using Laravel, please visit our technology page
- fullstackworld.com/
- github.com/tenancy/multi-tenant
A Package for Laravel Blade Extension Classes
Laravel created a Blade Extension package that allows you to register Blade extension classes in the service container that automatically get registered with the Blade compiler. You can also easily create new Blade extension classes with the provided php artisan make:blade
command (auto-registered package commands FTW).

Laravel Blade Extension Classes
The concept isn’t revolutionary by any means, but user like how it organizes their project-specific blade extensions into service container classes.
Let’s say, for example, that you have some custom directives around working with a shopping cart. Here’s a quick example of how it might look using Blade Extensions package:
<?php
namespace App\Blade;
use BitPress\BladeExtension\Contracts\BladeExtension;
class CartExtension implements BladeExtension
{
public function getDirectives()
{
return [
'cartcount' => [$this, 'getCartCount']
];
}
public function getConditionals()
{
return [
'cartempty' => [$this, 'isCartEmpty']
];
}
public function getCartCount()
{
// logic to return cart count
}
public function isCartEmpty()
{
// logic for empty cart
}
}
The above extension would provide the following directives in blade:
{{-- Conditional --}}
@cartempty
<p>The cart is empty</p>
@else
<p>The cart is not empty</p>
@endcartempty
{{-- Directive --}}
<span class="count">@cartcount</span>
It’s nothing special – it’s just PHP callables – but user like the feel of a dedicated class that can benefit from injecting services (i.e. a cart service) and keeping these related extensions grouped in one file.
If user need to add additional directives for the shopping cart, all they need to do is update the getDirectives()
method and define the associated callable.
You might find it interesting how this package’s service provider hooks into the Blade compiler. It’s pretty simple: the boot()
method just gets all services tagged with blade.extension
and registers the directives in the compiler.
// In the BladeExtensionServiceProvider::boot() method
foreach ($this->app->tagged('blade.extension') as $extension) {
if (! $extension instanceof BladeExtension) {
throw new InvalidBladeExtension($extension);
}
foreach ($extension->getDirectives() as $name => $callable) {
$this->app['blade.compiler']->directive($name, $callable);
}
foreach ($extension->getConditionals() as $name => $callable) {
$this->app['blade.compiler']->if($name, $callable);
}
}
The Blade Extensions package makes it easy to both create and register blade extensions in the service container:
php artisan make:blade Cart
And this is how you register it (it also tags the service) with the provided BladeRegistrar
class:
use App\Blade\CartExtension;
use BitPress\BladeExtension\Container\BladeRegistrar;
// ...
BladeRegistrar::register(CartExtension::class, function () {
return new CartExtension();
});
You can also use a provided helper method instead if you prefer:
blade_extension(CartExtension::class, function () {
return new CartExtension();
});
Essentially this is what the BladeRegistrar
does for you:
$this->app->singleton(CartExtension::class);
$this->app->tag(CartExtension::class, 'blade.extension');
Hire Laravel Developer from us, as we give you high quality product by utilizing all the latest tools and advanced technology. E-mail us any clock at – hello@hkinfosoft.com or Skype us: “hkinfosoft“.
To develop custom web app using Laravel, please visit our technology page.
Content Source:
- laravel-news.com