Как использовать пакет Laravel Арендодатель


Я все еще довольно новичок в Laravel и проработал некоторые фундаментальные laracasts. Сейчас я начинаю свой первый проект laravel, но я застрял на том, как использовать свой первый пакет "Арендодатель". В основном мне нужна настройка для нескольких арендаторов в моем приложении. У меня есть таблица компаний и таблица пользователей, в таблице пользователей есть столбец company_id. Когда компания регистрируется, она успешно создает компанию и прикрепляет идентификатор компании к пользователю.

Я предполагаю, что Арендодатель - лучший способ чтобы реализовать мультитенантное приложение, я проработал инструкции по установке, и теперь оно включено в мое приложение.

Однако в первой строке раздела "ИСПОЛЬЗОВАНИЕ" говорится: ВАЖНОЕ ПРИМЕЧАНИЕ: Арендодатель не имеет гражданства. Это означает, что при вызове addTenant() он будет охватывать только текущий запрос.

Убедитесь, что вы добавляете своих клиентов таким образом, чтобы это происходило по каждому запросу, и до того, как вам понадобятся модели с областью действия, например, в промежуточном программном обеспечении или как часть метод аутентификации без сохранения состояния, такой как OAuth.

И, похоже, мне нужно прикрепить фасад Landlord::addTenant('tenant_id', 1);.

Это может быть довольно простой ответ, который я упускаю из виду, но где лучше всего использовать addTenant и нужно ли мне повторно объявлять его с каждым контроллером или моделью? Должен ли я прикреплять его, когда пользователь входит в систему, использовать его в своих маршрутах или использовать в качестве промежуточного программного обеспечения? Если это промежуточное программное обеспечение, правильно ли следующее, чтобы получить идентификатор компании от текущего пользователя и использовать его с 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);
    }
}

Мой routes/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

Author: Derek, 2016-11-30

1 answers

Хотя это был только один вариант, я также пошел по маршруту 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 по завершении обновления автоматической загрузки.

 3
Author: camelCase, 2016-11-30 18:16:21