2016-11-29 3 views
4

Im все еще довольно новый для Laravel и проработал некоторые фундаментальные ларакасты. Теперь я начинаю свой первый проект laravel, но я зациклился на том, как использовать свой первый пакет «Landlord». В основном мне нужна настройка для Multi-Tenants в моем приложении. У меня есть таблица компании и таблица пользователей, таблица пользователя имеет столбец company_id. Когда компания регистрирует его, он успешно создает компанию и присоединяет company_id к пользователю.Как использовать Laravel Package LandLord

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

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

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

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

Это может быть довольно простой ответ, который я просматриваю, но где лучше всего использовать addTenant и нужно ли его обновлять с помощью каждого контроллера или модели? Должен ли я прикреплять его, когда пользователь подписывается, использует его на своих маршрутах или использует в качестве промежуточного программного обеспечения? Если это промежуточное программное обеспечение, то верно следующее: чтобы вытащить company_id от текущего пользователя и использовать его с помощью addTenant?

Middleware:

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

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

    return $next($request); 
} 

UPDATE

Вот мой промежуточного слоя (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', '[email protected]'); 

    //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

Если все ваши таблицы с данными арендаторов имеют ключ «tenant_id», то все они будут запрашиваться с глобальным дополнительным глобальным охватом 'WHERE'' tenant_id = ID' (конечно, если у них есть свойство «BelongsToTenants»). И да, промежуточное ПО - лучшее место для добавления арендаторов, imho –

ответ

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; 
} 

Update

Кроме того, убедитесь, что в файле config/app.php вы добавили landlord к providers массива:

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

И к aliases массива:

'aliases' => [ 

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

Тогда наконец composer dump-autoload, когда завершено к обновите автозагрузку.

+0

Я направился в правильном направлении. Я сделал все, что вы предложили здесь, но я получаю сообщение об ошибке «Trait» HipsterJazzbo \ Landlord \ BelongsToTenant «не найден» из моей модели. Есть идеи? – Derek

+0

@Derek Да, вы! Вы обновили конфигурационный файл 'app.php' с информацией Landlord? – camelCase

+0

Да, я выполнил инструкции по настройке на странице github. Вот скриншот моего файла bootstrap/app.php: http://imgur.com/a/gdtB6 – Derek

Смежные вопросы