Я работаю в мультитенантной системе, ранее я пробовал пакет https://github.com/hyn/multi-, но в конце концов я решил сделать это с помощью моего собственного метода.После большого количества исследований и тестирования разных вещей мне удалось создать этот код, но когда я выполняю его, он говорит мне, что метод подключения не определен, здесь я оставляю то, что я сделал, скорее всего, это связано с какой-то ерундой, которую яупустил из виду, но если кто-то может помочь мне решить эту проблему, я был бы очень признателен
помощники:
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
if(! function_exists('conexionBD')){
/**
* Establish a tenant database connection.
*
* @param $hostname
* @param $username
* @param $password
* @param $database
*/
function conexionBD($hostname, $username, $password, $database){
DB::purge('empresa');
Config::set('database.connections.empresa.host', $hostname);
Config::set('database.connections.empresa.database', $database);
Config::set('database.connections.empresa.username', $username);
Config::set('database.connections.empresa.password', $password);
DB::reconnect('empresa');
Schema::connection('empresa')->getConnection()->reconnect();
}
}
Empresa Модель:
class empresa extends Model
{
protected $fillable = [
'hostname',
'username',
'password',
'database'
];
public function ciudad() {
return $this->belongsTo('confia\ciudad');
}
public function empresaUsuario() {
return $this->hasMany('confia\empresasUsuario');
}
public function connect()
{
if (! $this->connected()) {
conexionBD(
$this->hostname,
$this->username,
$this->password,
$this->database
);
}
}
/**
* Check if the current tenant connection settings matches the company's database settings.
*
* @return bool
*/
private function connected()
{
$connection = Config::get('database.connections.empresa');
return $connection['username'] == $this->username &&
$connection['password'] == $this->password &&
$connection['database'] == $this->database;
}
}
Middleware Арендатор:
use Closure;
use confia\empresa;
class Tenant{
protected $company;
/**
* Tenant Conctructor
* @param empresa $empresa
*/
public function __construct(empresa $empresa)
{
$this->empresa = $empresa;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next) {
if (($request->session()->get('empresaId')) === null)
return redirect()->route('inicio')->withErrors(['error' => __('Por favor inicie sesión en alguna empresa antes de intentar esta acción')]);
// Get the company object with the id stored in session
$empresa= $this->empresa->find($request->session()->get('empresaId'));
// Connect and place the $company object in the view
$this->connect($empresa);
return $next($request);
}
}
В моей переменной сеанса empresaId я сохранил идентификатор своей компании concat в виде статической строки, это то, что дает мне имя базы данных, связанной с этой компанией.
Когда я запускаюсистема, во время изменения арендатора, чтобы начать работать с другой базой данных, я получаю следующую ошибку,
«Вызов приложения неопределенного метода \ Http \ Middleware \ Tenant :: connect ()»
Кто-то знает, что мой код отсутствует или я делаю что-то не так, чтобы заставить мультитенантную систему работать правильно?