Skip to content

IronnMan/mellita

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

梅利塔(Mellita)官方网站

鸣谢

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

每一个租户实例都有独立的数据库以及其配置。

彩蛋

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 开源协议。

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages