1. 現在のフレームワークの問題点は何ですか
現在主流のフレームワークである Zend Framework や Cakephp などはいずれも MVC モデルを採用し、URL ルーティング分散を実装しています。たとえば、http://www.xxx.com/user/login は userController オブジェクトの loginAction メソッドにマップされ、http://www.xxx.com/user/register は userController オブジェクトの registerAction メソッドに対応します。 userController オブジェクト。対応する userController オブジェクトは次のようになります。
class userController は、controller
{
function loginAction()
{
//login
}
function registerAction()
{}
}
?>
では、どのような問題があるのでしょうか?明らかに、不要なコードが含まれています。たとえば、/user/login にアクセスする場合、registerAction() メソッドにコンテンツを含める必要はありません。上記のコードは単純な例にすぎません。一般的に、コントローラーは小さな機能モジュールに相当し、特に大規模なプロジェクトでは、より多くの機能操作が行われます。このように、コントローラーに 12 を超えるメソッドがある場合、各リクエストには多くの冗長コードが含まれることになります。 PHP のパフォーマンスを向上させる上で非常に重要な点は、無関係なコードを含めないようにすることです。
最近の小規模プロジェクトでは、独自の phpbean フレームワーク (フレームワークは Zend Framework に似ています) を使用しましたが、その後の開発中に、実際に各コントローラーに含まれているアクションが多すぎることがわかり、後でオフロードを検討する必要がありました。しかし、それは理想とは程遠いです。
2. 問題はあなたが直面している人のせいではありません
多くの人は「冗長なコードを含むことはオブジェクト指向のエラーである」と考えていますが、私はそう思いません。前回の記事で述べたように、オブジェクト フェーシングはプロセス フェーシングのすべての機能を実現し、より効果的に実行できます。重要なのは、プロセス指向の思考を使用してオブジェクト指向プログラムを作成するのではなく、オブジェクト指向の思考を使用してオブジェクト指向の思考を使用することです。
3. この問題を解決するにはどうすればよいですか?
解決の鍵は行動を分けることです。どうやって分けるのですか?まず第一に、コントローラーの役割を理解する必要があります。コントローラーは主にリクエストを転送し、http リクエストを特定のアクションに転送するコントローラーです。注: Struts にはコントローラー ファイルはありません (これはコントローラーがないという意味ではないことに注意してください)。アクション ファイルに直接マップされます。したがって、コントローラをルーティングと転送に直接配置し、実際のプロセス制御、ロジック処理などをアクションに配置することができます。
たとえば、上記の例では、次の 2 つのファイルに分割できます:
loginAction.php
class loginAction extends Action
{
function run()
{}
}
?>
and
registerAction.php
class registerAction extends Action
{
function run()
{}
}
?>
これにより、アクションの分離が実現します。 /user/login にアクセスする場合、リクエストには registerAction コードは含まれません。
しかし、これには 2 つの問題があります:
まず、実際のプロジェクトではアクション ファイルが大量に存在するため、効果的な管理が鍵となります。
第二に、同じ機能モジュール内の操作には共通のコードがある可能性がありますが、それを共有するにはどうすればよいでしょうか?
最初の問題は解決するのが簡単です。同じモジュールのアクションをサブフォルダーに配置します。これは、複数レベルのディレクトリが許可されることを意味します。たとえば、上記のコードでは、loginAction.php と registerAction.php をユーザー ディレクトリに配置できます。ただし、これによりルート配布の手間が増えることに注意してください。実装方法については読者が考える必要があります。
2 番目の問題を解決するのは難しくありません。鍵となるのはオブジェクト指向の考え方を持つことです。ここでは、オブジェクトの継承を使用してこれを実現できます。たとえば、上の例では、最初にユーザー抽象クラスを定義できます。
class user extends Action()
{
function __contruct()
{
//たとえば、権限チェック
}
}
?>
次に、loginAction と RegisterAction の両方を user から継承させます。これは非常にうまく解決できます。
IV. 概要
上記の解決策は最近の私の考えにすぎず、十分に完璧ではない可能性があります。特定のアプリケーションをさらに洗練し、最適化することができます。 MVC やフレームワークに関して、私はいつも思うのですが、PHP5 ではプロシージャよりもオブジェクトの方が適していて効率的です(オブジェクト自体を作成するコストを除く)。関数を使ってフレームワークを実装するという点では、前回の PCTI の講義でも試しましたが、考え方は似ていると思いますが、どちらかというとオブジェクトの方が好きです。
最後に、上記の解決策は Java の Struts のいくつかのアイデアを参照しています。感謝の意を表したいと思います