4

特定の概念をよりよく理解するために、単純なMVCフレームワークを構築しようとしています。最初に対処することが重要だと思ったのは、アプリケーションのすべての要求を処理するフロントコントローラーです。

それについて考え始めたら、アプリケーションが使用するクラスをロードするための最良の方法がわかりませんでした。私の現在の考えのプロセスは、すべての要求がそれを利用するので、私のオートローダーはフロントコントローラーに配置されるべきであるということです。ほとんどのフレームワークは通常これをどこに置きますか?すでに構築されているいくつかのフレームワークを調べても、多くの機能が必要な機能をはるかに超えており、理解しにくいほど複雑になっているため、あまり役に立ちませんでした。

私が使用しようとしているクラスローダーは、https://gist.github.com/221634にあります。

単純なMVCフレームワークを適切に構築および編成する方法を理解しようとしているだけです。

4

3 に答える 3

3

ブートストラップファイルに入れる必要があります。

これはあなたがこれを行うことができる方法です:

  1. すべてのHTTPリクエストをフロントコントローラー、index.php、app.php、または呼び出したい方法に強制します。
  2. フロントコントローラーは、フレームワークで使用されるいくつかの定数を定義してから、Bootstrap.phpファイルを含めることができます。Bootstrapはアプリケーションを起動します。
  3. さて、私がBootstrapで最初に行うことは、自動読み込みを登録することです。このようにして、\ System \ Router\Routerクラスまたは\System\ Router \ Dispatcherクラスを簡単に取得でき、ポイントを取得できます。

もう1つ、アプリケーションのModelsフォルダーをPSR0クラスローダーに登録することもできます。したがって、Modelsフォルダーは次のようになります。

application/Models/
    - Entities
    - Services
        Email.php
        Cache.php

コントローラの内部から、このようなモデルを簡単に入手できます

public function someController()
{
    $email = new \Models\Services\Email();
    // Do stuff with email service
}     

質問に対する簡単な答えは、最初に「小刻みに動く」スペースを提供するフロントコントローラーを用意し、そこからアプリを起動するブートストラップをロードすることです。ブートストラップで最初に行うことは、クラスローダーを要求することです。 、およびアプリケーションを介して使用するライブラリを登録します。

次に、アプリケーションのコントローラーとモデルフォルダーの自動読み込みを登録することもできます。ブートストラップファイルの最後で、リクエストをディスパッチしようとしているときに、次のようにコントローラーを要求できます。

$app = new '\\Application\\Controllers\\' . $class;
// Dispatch request with call_user_func_array or ReflectionMethod and ReflectionClass

自動ロードされるため、Controllerクラスを必要とせず、正しい名前空間を指定するだけです。

すばらしい質問です。これがお役に立てば幸いです。カスタムMVCで遊んでいる他の人がいるのを見てうれしいです:)

于 2012-10-20T15:34:23.067 に答える
2

間違いなくブートストラップ段階です!

オートローダーはすべてのPHPアプリケーションの一部であり、初期化された最初のクラス/コード(の1つ)である必要があります。

私のMVC初期化手順:

于 2012-10-18T18:37:13.963 に答える
1

さて、「どこに行くの?」という質問です。私には、2つのより正確な質問を提案します。

  1. オートローダー関数/クラス定義を含むファイルはどこに保存されていますか?
  2. リクエストディスパッチサイクルのどこでインスタンス化、構成、および魔法の実行を許可する必要がありますか?

最初の質問-「クラスを含むファイルをどこに配置しますか?」-使用するオートローダークラスを特定したので、おそらくそれほど重要ではありません。正確な答えは、独自のフレームワークアプリの構造によって異なりますが、引用するような外部で開発されたクラスの場合、libまたはvendorディレクトリ内のどこかにおそらく意味があります。

2番目の質問-「インスタンス化、構成などはどこで行いますか?」-答えは次のとおりです。リクエストサイクルのできるだけ早い段階で、後で参照されるすべてのクラスの自動ロードのメリットを享受できます。実際には、それはおそらくブートストラッププロセスのどこかを意味します。

もちろん、これは通常、オートローダークラスをロードするために、手動require/include呼び出しを実行し、オートローダーオブジェクトをインスタンス化し、名前空間とパスを使用して構成する必要があることを意味します。

于 2012-10-18T18:48:13.300 に答える