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