$object = new Application_Model_Database()
すべてのコントローラーへの書き込みをなくすにはどうすればよいですか?
たとえば、記事のコントローラーの場合、$articles = new Application_Model_Articles()
コントローラーごとに入力する必要があります。ビューアーコントローラー、アクションヘルパー、またはその他の方法で配置する必要がありますか?
$object = new Application_Model_Database()
すべてのコントローラーへの書き込みをなくすにはどうすればよいですか?
たとえば、記事のコントローラーの場合、$articles = new Application_Model_Articles()
コントローラーごとに入力する必要があります。ビューアーコントローラー、アクションヘルパー、またはその他の方法で配置する必要がありますか?
あなたの質問は、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で作成されるため、テスト目的でそのブートストラップを交換できます。残念ながら、私は常にそうするわけではなく、上記で概説した原則を最も頻繁に使用します。)
コントローラでモデルを使用したい場合は、それを呼び出す必要があります。とにかく、いくつかのショートカットがここにあります
1.コントローラーのinitセクションで次のように初期化できます
public function init(){
$this->object = new Application_Model_Database();
}
そのthis->object
特定のコントローラーのすべてのアクションで使用できるように
2.上記の回答で提案されているようにZend_registryを使用します
さて、あなたは本当にすべてのコントローラーでそれを必要としますか?それはほとんど設計によるものだからです。必要なときにモデルを実装します。それほど多くのコードはありません。
これで、コントローラーからのアクション全体で使用する場合は、いつでも次のことができます。
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();
しかし、それでもあなたはまだいくつかの文字を書いています。
この助けを願っています!
もう1つの可能性は、 SymfonyDIコンポーネントなどの依存性注入コンテナを使用することです。オブジェクトのインスタンス化を処理し、いくつかの追加の利点があります。
上記のソリューションよりも少し面倒ですが、将来的にアプリケーションを保守および拡張する必要がある場合は、はるかに柔軟です。
お役に立てば幸いです。
このオブジェクトを使用してビューにデータを表示し、コントローラーを使用してデータを取得し、ビューに割り当てる場合は、次のようになります。
//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パーシャルビューヘルパーリファレンス