3

ここで質問するべきかどうかわかりません。その場合は、お知らせいただくか、移動/削除してください。

質問:

学習のために、非常に小さな個人用 Web サイト用に独自の小さな MVC「ライブラリ」を作成しています。使用されているプロセスは次のとおりです(正しい方法で行うことに近づいていない場合は、修正してください):

  • すべてのリクエスト (画像などを除く) は、index.php (ブーストラップ ファイル) を介して送信されます。
  • ブートストラップ ファイルはリクエストを解析し、コントローラとアクションを抽出します。例:

    http://www.Domain.com/Controller/Action/Argument1/Argument2/ ...

Controller がコントローラーである場合、action はコントローラーで呼び出されるメソッドです。この場合、次のようになります: Controller -> Action ( Argument1 , Argument2 );

ここで、ユーザーが次のサイトにアクセスした場合はどうなるでしょうか。

http://www.Domain.com/Controller/__destruct

また

http://www.Domain.com/Controller/__get/password

現在のソリューション:

  • $config->getURIFilter () メソッドなどを介してリクエストを実行します
  • method_exists () や is_callable () などのチェックを行います。
  • リクエストを処理するためではないメソッドをコントローラーに含めないでください

そもそもこれは問題ではないように思えますが、私の設計は間違っています。

PS私はすでに多くの優れた MVC PHP フレームワーク (CodeIgniter、Yii、CakePHP、Zend、Swiftlet など) を見てきました。

4

4 に答える 4

2

コントローラーが特定のアクションのみを処理するようにするか、たとえば

/controllers
 /user
  loginController.php
  logoutController.php

そして、その1つのことだけを行うクラスを用意します

class LoginController implements RequestHandler
{
    public function handleRequest(Request $request, Response $response)
    {
        …
    }

    private function someAuxiliaryMethod() {
        …

example.com/user/login が新しい LoginController を作成し、インターフェイス メソッドを呼び出すようにしますhandleRequest。これは戦略パターンです。

または、このようにコントローラーのアクションを分割したくない場合は、アクションの末尾に単語を付けます (Zend Framework はこれを行います)。

class UserController
{
    public function loginAction() {
        …

ブートストラップでサフィックスを追加し、それらのメソッドを呼び出します。

さらに別のオプションとして、URL をコントローラー アクションにマップできるルーターを導入し、オプションでサニタイズを実行して不正な形式の URL (アンダースコアの削除など) を除外することもできます。

于 2012-04-15T07:37:03.687 に答える
0

アンダースコアが前に付いているメソッドはすべてプライベートメソッドとして扱うことをお勧めします(method_existsでアンダースコアで始まっているかどうかを確認するときに、見つからないページを表示するだけです)。

于 2012-04-15T07:31:52.950 に答える
0

私はあなたがやっているのと同じ理由で自分のMVC構造を一度ロールしました、そしてこれを解決する方法は単にすべてのルーティング可能なコントローラーアクションに「アクション」という単語をプレフィックスとして付けるというアーキテクチャ上の決定をすることでした。

public function actionGetData(){

}

public function actionUpdateSomething() {

}

私がこれをした理由:

  • メソッドが何らかのURLを介して誤って公開されているかどうかを心配することなく、クラスのパブリック/保護/プライベートスコープを完全に制御できます。
  • これにより、ルーティング可能なアクションがプログラマーにわかりやすくなります。 public function actionDoSomething()パブリックURL(/controllerName/doSomething)を介して明確にアクセスできますが、public function getErDone()そうではありません。
  • ルーティング可能なアクションを特定するためにフープを飛び越える必要はありません。着信パラメータの前に「action」を付けるだけで、メソッドが存在するかどうかを確認できます。速くてシンプル。

これは本当にうまくいったことがわかりました。

于 2012-04-15T08:00:08.477 に答える
0

コントローラーに公開したくないメソッドをプライベートまたは保護としてマークするだけです。

複雑にしないでおく!

于 2012-04-15T07:38:53.047 に答える