1

価格をユーザーの通貨設定に変換するカスタム フィルターを実行する必要があります。そのため、最新の為替レートで毎日更新されるテーブルがあります。

この方法でフィルターを呼び出す予定です {{ '200'|price }} または {{ '200'|price('USD') }}

フィルターは、最初に Cookie からユーザー設定を取得します。

次に、通貨コードに基づいて最新の為替レートを照会し、実際の価格を変換します。

私の質問は、twig 拡張機能でデータベース クエリを実行しても問題ないかということです (フィルターはこちら)。

このフィルターを 1 ページで 10 回呼び出す必要があるかもしれません。それは、さらに 10 個のクエリを意味しますか?

どのようなより良い方法をアドバイスしますか?

4

3 に答える 3

3

はい、Doctrine のキャッシュ設定を定義しない場合、データベースにリクエストを送信して毎回データをフェッチすることになります。

為替レートをクエリするか、自分でキャッシュに保存するか、Doctrine のキャッシュ機能を使用するかを選択できます。

Symfony 2キャッシュDoctrineクエリ結果

どちらの方法も、毎回データベースからデータを直接クエリするよりも優れています。

于 2016-05-14T08:09:46.317 に答える
1

CurrencyConverterデータベースに一度だけクエリを実行し、ユーザーのリクエスト中にレートが変更されないと仮定してその結果を使用するクラスを作成できます。いくつかの単純なサービス (Twig 拡張機能に DI を挿入できます)

class CurrencyConverter
{
    /** @var EntityManager */
    private $em;

    private $rates = [];

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    public function convert($amount, $currency)
    {
        return $amount * $this->getRate($currency);
    }

    private function getRate($currency)
    {
        if (!isset($this->rates[$currency])) {
            $repository = $this->em->getRepository('AppBundle:Rate');
            $this->rates[$currency] = $repository->getLatestRate($currency);
        }

        return $this->rates[$currency];
    }
}

このようにして、通貨ごとのリクエストごとに 1 つのデータベース クエリが作成されます。ユーザー数が少ない場合はこれで十分かもしれません。MySQL はおそらく通貨レート テーブル全体をメモリにロードし、非常に高速になります。

Doctrine キャッシュはより高速になる可能性がありますが、キャッシュがあると追加の問題や疑問が生じます:

  • クエリ結果がキャッシュに保持される期間はどれくらいですか?
  • レート更新時に手動でキャッシュをクリアする必要がありますか?
  • キャッシュまたはデータベースから結果を取得しましたか?

等々。

于 2016-05-14T13:33:10.507 に答える