バージョン選択

フォーラム

メニュー

オンライン状況

33 人のユーザが現在オンラインです。 (29 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 32
marjo13m もっと...

PR

デザインテンプレート EC-CUBE3.0版が登場!
広告掲載について

サイト内検索

プラグイン > 開発について > Eccube\Applicationクラスの初期化について

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
yuy-tank
投稿日時: 2017/11/10 12:13
対応状況: −−−
新米
登録日: 2017/11/10
居住地:
投稿: 6
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
居住地:
投稿: 158
Re: Eccube\Applicationクラスの初期化について
> ECCUBEでは、どのページでも、アクセスする際に、
> Eccube\Applicationクラスの初期化を行っているのでしょうか?

毎回初期化が行われています。セッションのようにページ間をまたがって保持されるものではないです。

> 具体的には、商品詳細ページであるProductController::detailで
> $app[商品情報に関する既存のプロパティ]='新しく保存したい値'
> みたいな形で、ProductController::detailのフックポイントから値を保存したいです。そして、その情報をCartController::indexなど、ショッピングカートの途中で使いたいです。

これをしたいのであれば普通にセッションを使えばよいかと思います。


// 値の保持
$app['session']->set('key', 'value');

// 値の取得
$app['session']->get('key')


のように、$app['session']でセッションを扱うことができます。
yuy-tank
投稿日時: 2017/11/10 14:37
対応状況: −−−
新米
登録日: 2017/11/10
居住地:
投稿: 6
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
居住地:
投稿: 158
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
居住地: 宝塚
投稿: 1662
Re: Eccube\Applicationクラスの初期化について
引用:

たぶん同一リクエストや同一プロセス内で、複数回Applicationの初期化をする場合があり、その際の制御に必要だったんじゃないかなと思います。


正確には、 Application を引数やパラメータに保持しないクラスや関数から Application のインスタンスを取得した際、新たなインスタンスを生成してデータベースのコネクションが複数にならないようにする対策ですね。

https://github.com/EC-CUBE/ec-cube/issues/857#issuecomment-144291909

複数のコネクションを張ってしまうと、トランザクションの制御ができなくなったり、 SQLite3 でデータベースがロックしてしまったりと弊害が多いので、 Application は必ず唯一のインスタンス(Singleton)となるようにしています。
また、 Singleton にした場合、 initialized で初期化を制御してあげないと、 ServiceProviderInterface::register() が複数回コールされ、不具合の要因となってしまいます。


----------------
大河内健太郎(Kentaro Ohkouchi)
EC-CUBE公式エバンジェリスト
有限会社 Loop AZ

EC-CUBE1系2系長期サポートホスティングサービス CUBE Lab
https://cubelab.org/

yuy-tank
投稿日時: 2017/11/10 17:11
対応状況: −−−
新米
登録日: 2017/11/10
居住地:
投稿: 6
Re: Eccube\Applicationクラスの初期化について
なるほど、そういう事だったんですね。複雑なシステムなだけに弊害も多々考えられるのですね。納得できました。お二方ともありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

クレジットカード情報の非保持化対応

統計情報

総メンバー数は20,548名です
総投稿数は83,580件です

投稿数ランキング

1
seasoft
7331
2
AMUAMU
2712
3
nanasess
1662
4
yuh
1430
5
red
1076
6
fukap
907
7
shutta
827
8
468
800
9 ramrun 789
10
tsuji
784
11
umebius
723
12
tao_s
651
13 karin 641
14 sumida 638
15
homan
633
16 DELIGHT 571
17
patapata
502
18
flealog
483
19 tonton 436
20
ecbg
387


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© LOCKON CO.,LTD. All Rights Reserved.