2017-02-17 68 views
2

如何在運行時設置對所有請求都可見的全局變量?在登錄用戶之後,我需要保存數據庫連接的數據並在所有請求(使用中間件)連接到他的數據庫。

我剛剛證明了$GLOBALS的PHP和app()->singleton()的Laravel,但是,在這兩種情況下,在請求後我失去了變量的內容。爲什麼?如何爲Laravel中的所有請求設置全局變量

我該如何解決?我不想把db數據放到會話或緩存中。

+1

你爲什麼要存儲數據庫會話?你有每個用戶的個人數據庫嗎?是否有理由不能關閉數據庫連接並重新打開它與每個請求? – 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; 

請注意,如果新連接失敗,並且沒有測試代碼,則沒有錯誤處理。但是這可能足以讓你開始。