1

私は現在、PHPで記述され、アーキテクチャの点でZendFrameworkと幅広い類似点を共有するMVCフレームワークに基づくより大きなWebアプリケーションの開発に携わっています。

ユーザーがログインすると、現在のユーザーの仮想ポイントのバランスを表示することになっている場所があります。この表示は、すべての単一コントローラーのすべてのページに表示される必要があります。

サイドワイドモデルデータをフェッチするためのコードをどこに配置しますか?これはコントローラー固有ではありませんが、現在のコントローラーとは関係なく、すべてのページビューでサイト全体のレイアウトに配置する必要がありますか?MVCまたはZFヘッドはこれをどのように行いますか?そして、あなたの残りはどうですか?

ユーザーがログインしたときに残高を読み込んでセッションに保存することを考えましたが、残高は頻繁に変更されるため、これは正しくないようです。ページを読み込むたびに確認して更新する必要があります。また、すべてのコントローラーにフェッチルーチンを追加してそれを行うことも考えましたが、コードが重複するため、どちらも正しくないようでした。

4

3 に答える 3

1

この場合、私は通常、必要なデータ アクセスを実行し、データをビュー/レイアウトに追加するフックを備えたフロント コントローラー プラグインを使用します。dispatchLoopShutdown()次に、レイアウト スクリプトがそのデータをレンダリングします。

詳細はお問い合わせください。

[アップデート]

どのコントローラーが要求されたかに関係なく、データベース (または Web サービスまたは RSS フィード) からの最新の X 個のニュース項目をレイアウト内に表示したいとします。

フロントコントローラープラグインは、次のようになりますapplication/plugins/SidebarNews.php

class My_Plugin_SidebarNews
{
    public function dispatchLoopShutdown()
    {
        $front = Zend_Controller_Front::getInstance();
        $view = $front->getParam('bootstrap')->getResource('view');
        $view->sidebarNews = $this->getNewsItems();
    }

    protected function getNewsItems()
    {
        // Access your datasource (db, web service, RSS feed, etc)
        // and return an iterable collection of news items
    }
}

プラグインをフロントコントローラーに登録してください。通常はapplication/configs/application.ini次の場所にあります。

resource.frontController.plugins.sidebarNews = "My_Plugin_SidebarNews"

次に、レイアウトで、おそらく次のように、通常どおりレンダリングしますapplication/layouts/scripts/layout.phtml

<?php if (isset($this->sidebarNews) && is_array($this->sidebarNews) && count($this->sidebarNews) > 0): ?>
<div id="sidebarNews">
<?php foreach ($this->sidebarNews as $newsItem): ?>
<div class="sidebarNewsItem">
   <h3><?= $this->escape($newsItem['headline']) ?></h3>
   <p><?= $this->escape($newsItem['blurb']) ?></p>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>

私が何を意味するか分かりますか?

于 2012-04-06T17:08:00.850 に答える
1

あなたが探しているのはZend_Registryです。これは、何らかの形式のグローバル変数が必要だと思われる場合に使用する必要があるコンポーネントです。すべてのページでこれが必要な場合は、ブートストラップに追加するのが最善です。特定の場所でのみ必要な場合は、関連するコントローラーの init メソッドに追加します。

アプリケーション/Bootstrap.php

public _initUserBalance() 
{
    $userId = Zend_Auth::getInstance()->getIdentity()->userId;
    $user = UserService::getUser($userId);
    Zend_Registry::set('balance', $user->getBalance());
}

アプリケーション/レイアウト/default.phtml

echo 'Balance = ' . Zend_Registry::get('balance');

その小さなスニペットから正しいアイデアが得られるはずです!

于 2012-04-05T19:20:44.193 に答える