說到PHP估計有些朋友還有些熟悉,但是對於PHP下的laravel就表示不知道了。有些人因為需要使用到laravel時,卻發現過程中出現了問題,那就是session無法獲取了,鼓搗了半天也不得其法,讓人氣惱不已。面對這樣的情況我們應該怎麼辦呢?下面小編就給大家分享一下具體的示例程式碼,有需要的朋友可以收藏下來。
問題:引用第三方類庫時,使用全域性函式session()可以儲存session,但是獲取不到
1、路由置於 web 中介軟體下,修改app/Http/Kernel.php檔案,如下
protected
$middlewareGroups
= [
//中介軟體web
'web'
=> [
\App\Http\Middleware\EncryptCookies::
class
,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::
class
,
//看到這裡了嗎!StartSession!!!!要把路由放在這個中介軟體了才會啟動Session!!
\Illuminate\Session\Middleware\StartSession::
class
,
\Illuminate\View\Middleware\ShareErrorsFromSession::
class
,
\App\Http\Middleware\VerifyCsrfToken::
class
,
],
'api'
=> [
'throttle:60,1'
,
],
];
2、修改路由寫法,如下
//兩種路由中介軟體寫法各人喜好!
Route::get(
'/'
,
function
() {
//路由放在這裡
})->middleware(
'web'
);
Route::group([
'middleware'
=> [
'web'
]],
function
() {
//路由放在這裡
});
//routes.php
3、Laravel不用php原生的session,那麼在controller之後應該做了一些事情,將session寫入到檔案中,而不是每次put操作都寫操作,這樣會IO操作太頻繁的,影響效能的。
class
Middleware
implements
HttpKernelInterface
{
...
public
function
handle(Request
$request
,
$type
= HttpKernelInterface::MASTER_REQUEST,
$catch
= true)
{
$this
->checkRequestForArraySessions(
$request
);
if
(
$this
->sessionConfigured()) {
$session
=
$this
->startSession(
$request
);
// 啟動session
$request
->setSession(
$session
);
}
$response
=
$this
->app->handle(
$request
,
$type
,
$catch
);
// 呼叫controller的method
if
(
$this
->sessionConfigured()) {
$this
->closeSession(
$session
);
//關閉session
$this
->addCookieToResponse(
$response
,
$session
);
}
return
$response
;
}
...
protected
function
closeSession(SessionInterface
$session
)
{
$session
->save();
// 儲存session
$this
->collectGarbage(
$session
);
}
}
檢視呼叫相關的程式碼。laravel編譯後,在bootstrap/compiled.php中
可以看見,在呼叫完controller之後,呼叫了session->save()的方法,來主動的儲存session。這樣session才能落地儲存起來,如果在controller或者view裡面寫了exit;,那麼session是不會被儲存的,除非主動的寫Session::save()才能手工的儲存起來。或者把die();exit();換成return!
以上就是今天給大家分享的關於laravel無法獲取session了應該怎麼辦的具體解決教程了,相信大家如果再遇到這個問題就再也不用心煩了,只要按照示例說的來進行操作那麼就能輕鬆解決了。