2017-02-17 7 views
2

Как установить во время выполнения глобальную переменную, которая видна для всего запроса? После входа в систему мне необходимо сохранить данные соединения с БД и подключиться к его базе данных во всех запросах (с помощью промежуточного программного обеспечения).

Я только что доказал $GLOBALS PHP и app()->singleton() Laravel, но в обоих случаях после запроса я теряю содержимое переменной. Почему?Как установить глобальную переменную для всех запросов в Laravel

И как я могу решить? Я не хочу помещать данные db в сеанс или кеш.

+1

Почему вы храните сеанс базы данных? У вас есть отдельные базы данных для каждого пользователя или что-то еще? Есть ли причина, по которой вы не можете закрыть соединение db и повторно открыть его с каждым запросом? – Blakethepatton

+0

Также стоит отметить, что глобальные переменные устанавливаются только во время выполнения, что означает, что они не являются постоянными между запросами. Кроме того, соединения с базой данных истекают после определенной степени бездействия и, если ваш код зависит от того, что это соединение остается в сети, вы, вероятно, столкнетесь с некоторыми проблемами. – Blakethepatton

+0

Вам нужно сделать небольшое чтение в структурах приложений с несколькими арендаторами ... есть интересный пост в блоге об этом ... Он использует красноречивые области ... Взгляните, это может дать вам некоторое представление о том, как реализовать то, что вы хотите ... http://jkwl.io/application-architecture/2015/02/16/multi-tenancy-in-laravel5.html – Serge

ответ

0

Если он еще не сохранен на объекте пользователя, я бы, вероятно, сохранил информацию о подключении к базе данных с пользователем. Тогда я бы написать промежуточное программное обеспечение, чтобы создать соединение, если пользователь вошел в систему что-то вроде:.

public function handle($request, Closure $next) 
{ 
    if ($request->user()) { 
    $connection = new mysqli('localhost', $user->dbUsername, $user->dbPassword, $user->dbName); 
    $request->merge("connection" => $connection)); 
    return $next($request); 
    } 
    return redirect('login'); //the user isn't signed in 
} 

затем в своем коде вы будете использовать эту связь:

$this->connection = $request->connection; 

Обратите внимание, что при обработке нового соединения нет ошибок, и я не тестировал код. Но для этого вам, вероятно, достаточно кода.