1

$object = new Application_Model_Database()すべてのコントローラーへの書き込みをなくすにはどうすればよいですか?

たとえば、記事のコントローラーの場合、$articles = new Application_Model_Articles()コントローラーごとに入力する必要があります。ビューアーコントローラー、アクションヘルパー、またはその他の方法で配置する必要がありますか?

4

5 に答える 5

2

あなたの質問は、Zend Framework固有の質問ではなく、OOPのベストプラクティスの質問のように聞こえますフレームワークを使用しているかどうかに関係なく、またどのフレームワークを選択するかに関係なく、テスト容易性に基づいて、いつどこで新しいオブジェクトを作成するかを、何回書く必要があるかに基づいています$object = new My_Random_Object();

特にZendFrameworkについて言えば、どこでも、またはほとんどどこでも使用するオブジェクトは、Bootstrap.phpで作成されます。これらのオブジェクトには通常、データベースアダプター、ロガー、ビューオブジェクト、および使用する可能性のあるプラグインが含まれます。アプリケーション全体でこれらにアクセスするには、適切なコントローラーでプライベートプロパティを作成し、コントローラーのinit()メソッドでそれらのプロパティにオブジェクトを割り当てます。

class ExampleController extends Zend_Controller_Action
{

    public function init()
    {
        $bootstrap = $this->getInvokeArg('bootstrap');
        $this->_db = $bootstrap->getResource('db');
        $this->_log = $bootstrap->getResource('log');
        // and so on, and so forth
    }

}

理想的には、モデル、サービス、daosなどはすべて、コントローラーおよびアクションによって比較的緊密にグループ化されます。私の経験では、これは一般的に言えば、アプリケーションのすべてのコントローラーに同じモデルまたはサービスクラスが表示されている場合、組織に問題があります。そうは言っても、1つのアクションにのみ表示されるモデルは、そのアクションで作成されます。コントローラ内のアクション間である場合は、init()メソッドで作成され、プロパティに割り当てられます。複数のコントローラーにまたがって表示される場合は、Bootstrap.phpに作成されます。

(理想的には、すべてがBootstrap.phpで作成されるため、テスト目的でそのブートストラップを交換できます。残念ながら、私は常にそうするわけではなく、上記で概説した原則を最も頻繁に使用します。)

于 2012-01-12T05:41:22.113 に答える
1

コントローラでモデルを使用したい場合は、それを呼び出す必要があります。とにかく、いくつかのショートカットがここにあります

1.コントローラーのinitセクションで次のように初期化できます

public function init(){
   $this->object = new Application_Model_Database();
}

そのthis->object特定のコントローラーのすべてのアクションで使用できるように

2.上記の回答で提案されているようにZend_registryを使用します

于 2012-01-12T05:34:16.467 に答える
1

さて、あなたは本当にすべてのコントローラーでそれを必要としますか?それはほとんど設計によるものだからです。必要なときにモデルを実装します。それほど多くのコードはありません。

これで、コントローラーからのアクション全体で使用する場合は、いつでも次のことができます。

class MyController extends Zend_Controllers{
     $protected $_articleModel;

..。

コンストラクターまたは__init()関数で初期化して、すべてのアクションで使用できるようにします。$this->_articleModel

アプリケーションのどこにでもそれが本当に必要な場合は、ブートストラップで初期化し、レジストリに保存するだけです。

public function __initModels(){
  $articles = new Application_Model_Articles() 
  Zend_Registry::set('articles', $articles );
}

そして、次のようにコントローラーでアクセスします。

Zend_Registry::get('articles')->fetchAll();

しかし、それでもあなたはまだいくつかの文字を書いています。

この助けを願っています!

于 2012-01-12T04:45:39.283 に答える
1

もう1つの可能性は、 SymfonyDIコンポーネントなどの依存性注入コンテナを使用することです。オブジェクトのインスタンス化を処理し、いくつかの追加の利点があります。

  • 関心の分離。オブジェクトツリーの作成専用のコンポーネントがあります。
  • オブジェクトのテスト容易性。
  • 最後になりましたが、レイジーインスタンス化によってパフォーマンスが向上します(オブジェクトは、要求された場合にのみ作成されます)。したがって、リクエストを処理する特定のコントローラーによって一部のオブジェクトが使用されていない場合、そのオブジェクトはインスタンス化されません)。

上記のソリューションよりも少し面倒ですが、将来的にアプリケーションを保守および拡張する必要がある場合は、はるかに柔軟です。

お役に立てば幸いです。

于 2012-01-12T09:14:18.253 に答える
0

このオブジェクトを使用してビューにデータを表示し、コントローラーを使用してデータを取得し、ビューに割り当てる場合は、次のようになります。

//someControllerAction
$object = new Application_Model_Articles();
$object->fetchAll();
//assign to view
$this->view->articles = $object;

次のようなビューヘルパーを作成した方がよい場合があります。

//Articles.php put in /application/views/helpers  
class Zend_View_Helper_Articles extends Zend_View_Helper_Abstract {

public function Articles() {

$articles = new Application_Model_Articles();
$articles->fetchAll();
//return rowset object
return $articles;

次に、ビュー(phtml)で次のようなことを行うことができます。

//someView.phmtl
<?php $articles = $this->Articles(); ?>
<h1><?php echo $this->escape($articles->title); ?></h1>
<p><?php echo $this->escape($articles->body); ?></p>

ビューヘルパーを作成すると、モデルからのデータを表示するだけでよい場合に、コントローラーを完全にバイパスできます。これは非常に単純な例であり、partialsおよびpartialLoopsで使用できます。
REF:ZFリファレンスカスタムビューヘルパー
ZFパーシャルビューヘルパーリファレンス

于 2012-01-12T09:48:54.850 に答える