質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1598閲覧

LaravelでVendor内クラス(StartSession)の拡張ができず困っています。

wasi300

総合スコア66

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/03/13 08:34

編集2019/03/13 08:39

いつもお世話になります。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 ▶}

上記になります。どなたか、教えて頂けないでしょうか。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

最初の方のコードがだめな原因はStartSessionCustomで再定義したhandle関数でしょう。コメントからみてmake:middlewareが生成したのがそのまま残っているのだろうと思いますが、この状態ではこのミドルウェアは何もしません。

置き換えたいのはgetSessionのみで他はそのまま使いたいのだから、handleを自分で再定義してはいけません。StartSessionCustomからhandleをまるごと削れば親クラスのhandleが有効になってその処理の中から新たに作成したgetSessionが呼ばれるようになると思います。そこから先はその中身次第です。

投稿2019/03/13 12:05

crhg

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wasi300

2019/03/13 15:56

家でテスト環境作ってやってみたところ、問題なく動作いたしました。 どうもありがとうございました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問