1

これは少しわかりにくいかもしれませんので、はっきりしない場合は事前にお詫び申し上げます。

私は自分のMVCフレームワークを書いていますが、もう一度行き詰まります。

フレームワークのコントローラークラスを作成中です。基本的にこれはそれがどのように機能するかです:

  • 抽象クラスを拡張するクラスcoreControllerをインスタンス化します
  • coreControllerは、クエリ文字列を解釈してロードされるコントローラーを設定します
  • 変数に格納されているクエリ文字列値
  • 他の変数に値が割り当てられました
  • 新しいコントローラがロードされます
  • 新しいコントローラは、アクションオブジェクトをインスタンス化する必要があるかどうかをチェックします。
  • 新しいアクションコントローラーがロードされます
  • アクションコントローラは、それが必要な最後のオブジェクトであるかどうかをチェックします。
  • アクションコントローラは、スクリプトの残りの部分で参照されるオブジェクトとして返されます。

汎用の$controller->method()を呼び出して、ロードされた最終コントローラーを参照できます。

別の概要:

coreController
    pageController
       pageControllerActionAdd
       return as object to start

$controller->something(); //References pageControllerActionAdd

基本的に、私ができるようにしたいのは、次のようなURLを入力できるようにすることです 。http ://www.mywebsite.com/page/modify/

スクリプトにPageModifyControllerを変数としてプルアップさせて、そのメソッドを実行できるようにします。

私がしていることのより良い方法を教えていただければ、どうぞどうぞ。コードを書く必要はありません。アイデアだけが素晴らしいでしょう。私が現在行っている方法は非常に混乱し、デバッグが難しいというだけです。私は複数のネストされたオブジェクトになってしまいますが、その概念は好きではありません。

私は他の多くのソースコードを読んでいて、それも非常に洗練されている可能性があることがわかりました。

4

1 に答える 1

1

私は実際に、あなたが実装しようとしている方針に沿って機能するフレームワークを作成しました。不足しているのはRoutingHandlerクラスだと思います。ルーティングはURLの物理的な操作であり、ロードするコントローラーと実行するアクションをアプリケーションに指示します。

私の世界にはモジュールもあるので、基本的なルーティングスキームは

Module -> Controller -> Action

これらの3つの項目は、その方法で私のURIスキームにマップされます。変数も次のように追加できます...

http://www.domain.com/module/controller/action/var1/val1/var2/val2

では、URIが解析され、制御が適切なコントローラーとアクションに渡された後はどうなるでしょうか。簡単な例を示すためにいくつかのコードを作成しましょう...

<?php    
    class indexController extends Controller {

        protected function Initialize() {
            $this->objHomeModel = new HomeModel;

            $this->objHeader = new Header();
            $this->objFooter = new Footer();

            $this->objHeader
                ->SetPageId('home');
        }

        public function indexAction() {
            $this->objHeader->SetPageTitle('This is my page title.');
        }

        // other actions and/or helper methods...
    }
?>

このInitializeメソッドでは、コントローラー全体のものを設定し、後で使用するためにモデルのインスタンスを取得しています。本物の肉はindexActionメソッドにあります。これは、ビューで使用するものを設定する場所です。例えば...

public function randomAction() {
    $this->_CONTROL->Append($intSomeVar, 42);
}

_CONTROLは、操作してビューに渡す値の配列です。このControllerクラスは、アクションにちなんで(および兄弟ディレクトリで)名前が付けられているため、ビューに適したテンプレートを見つける方法を知っています。

親クラスはアクションメソッドの名前を取り、そのControllerように解析します...

indexAction -> index.tpl.php

ここで他の楽しいことをすることもできます、例えば...

Application::SetNoRender();

...コントローラーにテンプレート内でレンダリングしないように指示しますが、メソッドを完了するだけです。これは、実際には何も出力したくない状況で役立ちます。

最後に、すべてのコントローラー、モデル、およびビューは、次のように独自のModuleディレクトリ内にあります...

my_module
    controllers
        indexController.class.php
        someotherController.class.php
        :
        :
    models
        HomeModel.class.php
        :
        :
    templates
        index.tpl.php
        someother.tpl.php
        :
        :

必要な数のモジュールを持つことができます。つまり、モジュールやコントローラーによって機能を分離できます。

先に進むこともできますが、これは記憶から書いているので、あちこちにシワがありますが、これがあなたに思考の糧を与えてくれることを願っています。

于 2013-01-05T08:58:36.180 に答える