如何使用Laravel Package LandLord

时间:2016-11-29 22:44:44

标签: php laravel laravel-5.2

我仍然是Laravel的新手,并且已经完成了一些基本的laracasts。现在我开始了我的第一个laravel项目,但我仍然坚持如何使用我的第一个包#34; Landlord"。基本上我需要在我的应用程序中设置多租户。我有一个公司表和一个用户表,用户表有一个company_id列。当公司注册成功创建公司并将company_id附加到用户时。

我认为Landlord是实现多租户应用程序的最佳方式,所以我完成了安装说明,现在我将它包含在我的应用程序中。

然而,USAGE部分的第一行说: 重要提示:房东是无国籍人。这意味着当你调用addTenant()时,它只会调用当前请求。

  

确保以这样的方式添加租户   发生在每个请求上,并且在你需要模型范围之前,就像在a   中间件或作为OAuth等无状态身份验证方法的一部分。

看起来我需要附上一个Landlord::addTenant('tenant_id', 1);门面。

这可能是一个非常简单的答案我忽略但是哪里是使用addTenant的最佳位置,我是否必须使用每个控制器或模型重新声明它?我应该在用户登录时附加它,在我的路线中使用它还是用作中间件?如果是中间件,则以下内容正确,以便从当前用户中提取company_id并将其与addTenant一起使用?

中间件:

public function handle($request, Closure $next){
    $tenantId = Auth::user()->tenant_id;

    Landlord::addTenant('tenant_id', $tenantId);

    return $next($request);
}

更新

这是我的中间件(MultiTenant.php)

<?php

namespace App\Http\Middleware;

use Closure;
use App\User;
use Illuminate\Support\Facades\Auth;

class MultiTenant
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */

    public function handle($request, Closure $next)
    {        
        if (Auth::check()) {
            $tenantId = Auth::user()->company_id;

            Landlord::addTenant('company_id', $tenantId); // Different column name, but same concept
        }

        return $next($request);
    }
}

我的路线/ web.php

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of the routes that are handled
| by your application. Just tell Laravel the URIs it should respond
| to using a Closure or controller method. Build something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();
Route::group(['middleware' => ['multitenant']], function () {
    Route::get('/home', 'HomeController@index');

    //Clients
    Route::resource('clients', 'ClientController');
});

我的Client.php模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use HipsterJazzbo\Landlord\BelongsToTenants;

class Client extends Model
{
    use BelongsToTenants;
    //
    protected $fillable = [
        'organization',
    ];

}

https://github.com/HipsterJazzbo/Landlord#user-content-usage

1 个答案:

答案 0 :(得分:3)

虽然只有一个选项,但我也走了middleware路线。我认为这是实现它的一种简单方法。

我将middleware添加到我的routes/web.php文件中:

Route::group(['middleware' => ['landlord']], function () {
    // Your routes
});

我的landlord middleware看起来像这样:

public function handle($request, Closure $next)
{        
    if (Auth::check()) {
        $tenantId = Auth::user()->company_id;

        Landlord::addTenant('company_id', $tenantId); // Different column name, but same concept
    }

    return $next($request);
}

然后我只需将trait添加到我想要作用域的模型中:

use HipsterJazzbo\Landlord\BelongsToTenant;

class User extends Authenticatable
{
    use BelongsToTenant;
}

<强>更新

另外,请确保在config/app.php文件中已将landlord添加到providers数组中:

'providers' => [
    // ...
    HipsterJazzbo\Landlord\LandlordServiceProvider::class
    // ...
],

aliases数组:

'aliases' => [

    // ...
    'Landlord'   => HipsterJazzbo\Landlord\Facades\Landlord::class,
    // ...
],

最后完成composer dump-autoload以刷新自动加载。