いつもお世話になります。illuminate内のStartSessionクラスに処理を書かない方法を探しております。
セッション取得時に、特定の端末の時だけ別の処理をしたいです。
なので、getSessionをオーバーライドしたいのですが、上手く行かず困っています。
■ 試した事
0. ミドルウェアの作成
0. サービスプロバイダの作成
0. Kernelにミドルウェアを登録
0. サービスプロバイダのregisterにSingletonを利用してmiddlewareを登録
middlewareは動作するのですが、middlewareの処理の中でエラーになり処理が止まります。
Laravelからのエラーは
Session store not set on request.
このように表示されます。
自分の認識では、middlewareにStartSessionをextendsして、
同名のメソッド(getSession)を生成することで、
middrewareに書かれたメソッドが機能する
(StartSessionのgetSessionではなくmiddlrewareに書かれたgetSessionが動く)
と思っております。
middreware内のgetSessionを動かすために、欠けている条件はございますでしょうか。
php
1 2namespace App\Http\Middleware; 3 4use Illuminate\Session\Middleware\StartSession; 5use Illuminate\Http\Request; 6use Closure; 7 8class StartSessionCustom extends StartSession 9{ 10 /** 11 * Handle an incoming request. 12 * 13 * @param \Illuminate\Http\Request $request 14 * @param \Closure $next 15 * @return mixed 16 */ 17 public function handle($request, Closure $next) 18 { 19 return $next($request); 20 } 21 22 23 public function getSession(Request $request) 24 { 25 return tap($this->manager->driver(), function ($session) use ($request) { 26 //独自処理 27 }); 28 } 29} 30
この記事をベースに実装致しました。
先ほどのコードでは上手く行かなかったので、同じ実装で試してみました。
php
1namespace App\Http\Middleware; 2 3use Illuminate\Session\Middleware\StartSession; 4use Illuminate\Http\Request; 5use Closure; 6 7class StartSessionCustom extends StartSession 8{ 9 10 protected $init_cookie = false; 11 /** 12 * Handle an incoming request. 13 * 14 * @param \Illuminate\Http\Request $request 15 * @param \Closure $next 16 * @return mixed 17 */ 18 public function handle($request, Closure $next) 19 { 20 $this->sessionHandled = true; 21 if ($this->sessionConfigured()) { 22 $session = $this->startSession($request); 23 $request->setSession($session); 24 $this->collectGarbage($session); 25 } 26 $response = $next($request); 27 if ($this->sessionConfigured()) { 28 $this->storeCurrentUrl($request, $session); 29 $this->addCookieToResponse($response, $session); 30 } 31 return $response; 32 } 33 34 35 public function getSession(Request $request) 36 { 37 38 $session = $this->manager->driver(); 39 40//独自実装 41 42 return $session; 43 44 } 45 46} 47
こちらで試した見たところ、setsessionメソッド内で
"Argument 1 passed to Symfony\Component\HttpFoundation\Request::setSession() must be an instance of Symfony\Component\HttpFoundation\Session\SessionInterface, in ▶"
このようにエラーが表示されます。
この時引数に渡されるのは
Store {#338 ▶}
上記になります。どなたか、教えて頂けないでしょうか。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/13 15:56