JetBrains | Laravel | Dcat Admin | Tenancy
Mellita 可以使任何 Laravel 应用具备 SaaS 能力,只需要简单的 composer 安装以及极其少量的改动。无论你是打算使用 Laravel 项目开发新项目,还是将已经付出努力的项目转化为 SaaS 架构,都可以轻松实现。
Mellita 拥有一个控制台,控制台用于管理 SaaS 的租户实例,可以对其进行创建或是删除。对于租户实例则采用了分库的方式来处理,以使用户数据得到最基本的安全隔离保障和更加高效的数据库 I/O 效率。
Laravel
没错,只有它,Mellita 所需的环境依赖正是 Laravel 所需的环境依赖。
composer require celaraze/mellita
1:执行 php artisan mellita:install
2:于 app/Providers/RouteServiceProvider.php
文件中:
<?php
namespace App\Providers;
use Dcat\Admin\Admin;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
public const HOME = '/home';
public function boot()
{
$this->configureRateLimiting();
// 注意,Mellita SaaS Console依赖它注册路由,必须。
Admin::routes();
// 注意结束
// 注意,这些方法在本类中声明,找到对应的方法查看说明
// 如果声明了,就必须要加入到本方法内
$this->mapWebRoutes();
$this->mapApiRoutes();
$this->mapAdminRoutes();
// 注意结束
}
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});
}
/**
* 获取根域名
* 注意,这个方法是必须的。
* @return array
*/
protected function centralDomains(): array
{
return config('tenancy.central_domains');
}
/**
* web 路由处理
* 注意,按照你的想法处理,如果声明此方法,web 路由将无法被租户实例所访问到
* 只能通过Console访问
*/
protected function mapWebRoutes()
{
foreach ($this->centralDomains() as $domain) {
Route::middleware(['web'])
->domain($domain)
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
}
/**
* api 路由处理
* 注意,按照你的想法处理,如果声明此方法,api 路由将无法被租户实例所访问到
* 只能通过Console访问
*/
protected function mapApiRoutes()
{
foreach ($this->centralDomains() as $domain) {
Route::prefix('api')
->domain($domain)
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
}
/**
* console 路由处理
* 注意,这是必须的
*/
protected function mapAdminRoutes()
{
foreach ($this->centralDomains() as $domain) {
Route::domain($domain)
->middleware(['web', 'admin'])
->namespace($this->namespace)
->group(base_path('app/Admin/routes.php'));
}
}
}
租户实例的数据库迁移,移动至:app/database/migrations/tenant
文件夹中。
执行租户实例数据库迁移的命令是:php artisan tenants:migrate
。
为租户定义的路由写在:app/routes/tenant.php
文件中。
访问 http://your-domain/admin
,在租户实例中可以进行创建。
每一个租户实例都有独立的数据库以及其配置。
Mellita 可以和 DcatAdmin 完美联动,如果租户实例是通过 DcatAdmin 开发的应用,那么可以直接通过命令 php artisan admin:app ApplicationName
来创建多应用,
然后在 app/admin.php
文件中做以下配置:
return [
//...我是其它配置内容
'multi_app' => [
// 与新应用的配置文件名称一致
// 设置为true启用,false则是停用
'application_name' => true,
],
];
执行完成之后,application_name
的后台应用即为租户实例的应用,无需其它配置,逻辑代码则应该写在app/ApplicationNmae
文件夹中。
如果对此有疑问,可以查看 DcatAdmin 多应用文档 。
Mellita 遵循 GPL3.0 开源协议。