0

現時点では、太いコントローラーと薄いモデル レイヤーがあります。

私のコントローラーはこんな感じです。

namespace controller;
class home
{


    public $template = 'home';

    protected $database;

    public function __construct(\Zend\Db\Adapter\Adapter $database){
        $this->database = $database;

    }

    /**
     * Returns the home page
     */
    public function indexView(){


        $userService = new UserService($this->database);
        $view = new ViewModel($this->template);
        $view->assign('pageTitle', 'Home');
        $view->assign('lead', "Welcome ".$userService->getFirstName());
        $view->assign('h1', 'Home');


    }
}

私のモデルは、データ操作、データ収集などで構成されます。

これが呼び出す viewModel クラスであるビューは、基本的に、ヘッダー、フッター、および内部で使用される実際のテンプレートを含むコンテナー クラスです。

MVC に関して言えば、Model と View がお互いを認識していることがわかりました。

私はこれを正しい方法で行っていますか?

4

2 に答える 2

2

MVC パターンには、MVP (Model View Presenter) を含む多くのバリエーションがあり、どこを見ても、これらはわずかに異なって説明できます。

通常よくあることの 1 つは、モデルがコントローラーとビューの両方をまったく認識しないようにすることです。これにより、必要に応じてモデルを交換できます。モデルがどちらからも必要とするものは何もありません。

代わりに、モデルがオブザーバブルであり、コントローラーおよび/またはビューがオブザーバーであるオブザーバーパターンが採用されています。モデル内の何かが変更されると、オブザーバーの update/notify メソッドが呼び出され、変更があったことが通知されます。

1 つのバリエーションは、ビューを管理する監視コントローラーですが、イベントなどには干渉しません。

例が示すように、優れた監視コントローラーの本質は、できる限り少ないことをすることです。可能な限りビューに処理させ、より複雑なロジックが含まれる場合にのみ介入します。

最後に、PHP に関しては、 CodeIgniter MVCの使用を示すこの役立つ回答を確認してください。他の Web フレームワークを見ている場合、Yii フレームワークでは MVC も十分にカバーされているようです。

于 2013-01-01T03:10:37.150 に答える
0

短い答え:いいえ、あなたは正しい方法で行っていないか、少しでも正しい方法でさえありません。

MVC 設計パターンは、関心の分離に関するものです。モデル レイヤーをプレゼンテーション レイヤーから分離します。つまり、ドメイン ビジネス ロジックを、それがどのように示されるかから分離します。

プレゼンテーション レイヤーでは、UI の作成を管理するコンポーネント (ビュー) から、ユーザー インタラクションを担当するコンポーネント (コントローラー) を分割します。

モデル レイヤーもある程度分離される可能性がありますが、通常は「初心者による初心者向けの mvc」ブログ記事では取り上げられていません。以前の投稿で簡単な説明を書きました。しかし、モデル層の実装方法を実際に理解したい場合は、Folwer のPoEAAを読む必要があります。

従来の MVC (Web には使用できません) および Model2 MVC パターンでは、ビューは必要なすべてのデータをモデル レイヤーから要求します。コントローラーは、ユーザー入力を適用することによって、モデル レイヤーと現在のビューの状態のみを変更します。

他の MVC に着想を得たデザイン パターン (MVVM および MVP) の最も単純な実装では、コントローラーのような構造 (ViewModel および Presenter - それぞれ) がモデル レイヤーからのデータをビューに提供します。これは、コントローラー内にビューモデルを配置しても意味がないことも意味します。MVP パターンの詳細については、この出版物を参照してください。

PSまた、コントローラーにDB接続を注入するのはなぜですか?それを渡すだけです。そのコード フラグメントはLoDに違反しています。コントローラー内のモデル レイヤーから構造を取得する必要がある場合は、代わりにファクトリを注入する必要があります。

于 2013-01-01T11:10:07.573 に答える