プラグイン > 開発について > Eccube\Applicationクラスの初期化について |
開発について
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
yuy-tank |
投稿日時: 2017/11/10 12:13
対応状況: −−−
|
一人前 登録日: 2017/11/10 居住地: 投稿: 72 |
Eccube\Applicationクラスの初期化について ECCUBEでは、どのページでも、アクセスする際に、
Eccube\Applicationクラスの初期化を行っているのでしょうか? すなわち、アクセスするたびにindex.phpのinitialize()メソッドを実行して、サービスプロバイダなどを登録しているのでしょうか?それとも、セッションなどでApplicationクラスそのものを保存して、いつでも使えるようにしているのでしょうか?もし、アクセスするたびに初期化している場合、プラグインで特定のフックポイントからプロパティを変更しても、別のページに遷移すればそのデータは、初期化後のデータに戻るということでしょうか? 具体的には、商品詳細ページであるProductController::detailで $app[商品情報に関する既存のプロパティ]='新しく保存したい値' みたいな形で、ProductController::detailのフックポイントから値を保存したいです。そして、その情報をCartController::indexなど、ショッピングカートの途中で使いたいです。 |
nyorai |
投稿日時: 2017/11/10 13:32
対応状況: −−−
|
仙人 登録日: 2015/8/21 居住地: 投稿: 302 |
Re: Eccube\Applicationクラスの初期化について > ECCUBEでは、どのページでも、アクセスする際に、
> Eccube\Applicationクラスの初期化を行っているのでしょうか? 毎回初期化が行われています。セッションのようにページ間をまたがって保持されるものではないです。 > 具体的には、商品詳細ページであるProductController::detailで > $app[商品情報に関する既存のプロパティ]='新しく保存したい値' > みたいな形で、ProductController::detailのフックポイントから値を保存したいです。そして、その情報をCartController::indexなど、ショッピングカートの途中で使いたいです。 これをしたいのであれば普通にセッションを使えばよいかと思います。
のように、$app['session']でセッションを扱うことができます。 |
yuy-tank |
投稿日時: 2017/11/10 14:37
対応状況: −−−
|
一人前 登録日: 2017/11/10 居住地: 投稿: 72 |
Re: Eccube\Applicationクラスの初期化について なるほど、セッションを使えばいいのですね。盲点でした。ちなみに、趣旨は変わりますが、Eccube\Applicationクラスは毎回初期化されているということですが、だとすればEccube\Applicationクラスのinitializedというプロパティは一体何のために使われているのでしょうか?initialize()メソッドを呼び出すと、最後にinitialized=trueとセットされており、次からinitialize()メソッドを呼び出すと、初期化せずにリターンするように、このプロパティは使われているようです。
しかし、毎回Eccube\Applicationクラスが初期化されるのであれば、どこかのページにアクセスするたびにinitializedプロパティは自動的に初期値であるfalseに設定され、このプロパティは意味がなくなると思います。実際、このプロパティは何のためにあるのでしょうか? |
nyorai |
投稿日時: 2017/11/10 16:05
対応状況: −−−
|
仙人 登録日: 2015/8/21 居住地: 投稿: 302 |
Re: Eccube\Applicationクラスの初期化について > initializedというプロパティは一体何のために使われているのでしょうか?
initializedが入ったのはこのpull requestだと思いますが、 https://github.com/EC-CUBE/ec-cube/pull/1378 たぶん同一リクエストや同一プロセス内で、複数回Applicationの初期化をする場合があり、その際の制御に必要だったんじゃないかなと思います。 |
nanasess |
投稿日時: 2017/11/10 16:28
対応状況: −−−
|
神 登録日: 2006/9/9 居住地: 投稿: 2303 |
Re: Eccube\Applicationクラスの初期化について 引用:
正確には、 Application を引数やパラメータに保持しないクラスや関数から Application のインスタンスを取得した際、新たなインスタンスを生成してデータベースのコネクションが複数にならないようにする対策ですね。 https://github.com/EC-CUBE/ec-cube/issues/857#issuecomment-144291909 複数のコネクションを張ってしまうと、トランザクションの制御ができなくなったり、 SQLite3 でデータベースがロックしてしまったりと弊害が多いので、 Application は必ず唯一のインスタンス(Singleton)となるようにしています。 また、 Singleton にした場合、 initialized で初期化を制御してあげないと、 ServiceProviderInterface::register() が複数回コールされ、不具合の要因となってしまいます。 |
yuy-tank |
投稿日時: 2017/11/10 17:11
対応状況: −−−
|
一人前 登録日: 2017/11/10 居住地: 投稿: 72 |
Re: Eccube\Applicationクラスの初期化について なるほど、そういう事だったんですね。複雑なシステムなだけに弊害も多々考えられるのですね。納得できました。お二方ともありがとうございました。
|
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |