1

だから私はEngine.phpというライブラリを持っていて、それが基本的に行うことは実行中です

example.com/controller/method/value

たとえば、私が持っている場合

example.com/category/images

「images」と呼ばれるメソッドを実行します。しかし、すべてのカテゴリのコードを追加したくはありません。メソッドを変数にしたい(後でdbで機能させるため)。

エンジンを変更せずにこれを達成するにはどうすればよいですか? 問題は、一部のページにカテゴリがまったくないことです。そして、エンジン自体を書き直したくありません。

どうにかしてコントローラーでこれを行うことはできますか?例えば:

「category」というコントローラーに入ります。メソッドが設定されている場合、コントローラー (「category」) 内でこのメソッドが検索されます。

これは、私の Engine.php の一部がどのように見えるかです:

    if (isset($url_output[1])) {
        if (isset($url_output[2])) {
            if (method_exists($controller,$url_output[1])) {
                $controller->{$url_output[1]}($url_output[2]);
            } else {
                $this->error();
            }
        } else {
            if (method_exists($controller,$url_output[1])) {
                $controller->{$url_output[1]}();
            } else {
                $this->error();
            }
        }
      }

ご覧のとおり、基本的には次のようになります。

$controller->{$url_output[1]}();

$url_output[1] = $url_output[0] という名前のコントローラーのメソッドの名前。

私が欲しいのは:

public function $category() {
echo $category
}

私の言っていることが分かるよね?

4

3 に答える 3

1

あなたがする必要があるのはあなたのプロジェクトのための本当のルーティングメカニズムを作成することです。私はすでに他の2つの答えでそれをカバーしました:これこれ。そのうちの1つはすでに一度リンクしました。

重要なのは、着信URLと一致させることができる正規表現(regexp)を作成することです。一致するパターンが見つかった場合はpreg_match()、URLの必須ではない部分が欠落している場合は、それを使用して分割し、いくつかのデフォルト値を割り当てます。

ルーティングメカニズムを独自に作成することも、他のプロジェクト(単純または複雑)から移植することもできます。

また、アプリケーションのルーティング部分を、コントローラーへのディスパッチを処理する部分から分離する必要があります。コントローラにそのようなメソッドがあるかどうか、またはユーザーがそのメソッドへのアクセスを許可されているかどうかを確認することは、ルーティングプロセスの一部ではありません。それらを混ぜ合わせると、SRPに違反することになります。

于 2012-08-08T20:11:52.757 に答える
1

変数変数を使用してみることができます。
警告:これはセキュリティの観点からはかなり危険なので、これを行う場合は、入力を検証する必要があります。

if (isset($url_output[1])) {
    if (isset($url_output[2])) {
        if (method_exists($controller,$url_output[1])) {
            $controller->{$url_output[1]}($url_output[2]);
        } else {
            $this->error();
        }
    } else {
        if (array_search($allowed_categories, $url_output[1]) !== FALSE) {
            echo ${$url_output[1]};
        } else {
            $this->error();
        }
    }
  }

基本的に、の場合$url_output[1]image、に${$url_output[1]}変換され、変数$imageの値が出力されます。$image変数は、$allowed_categories処理するカテゴリを含む配列である必要があります。これは、悪意のあるユーザーが機密変数を出力するカテゴリに入るのを防ぐためです。

于 2012-08-08T19:51:48.723 に答える
1

このようなURLを作ってみませんか

example.com/category/index/images

ここで、index はカテゴリ コントローラーの定義済み関数であり、画像は最初のパラメーターとして index 関数に渡されます。

2 番目のオプションは、url のインデックス関数をバイパスします。

if (isset($url_output[1])) {
    if (method_exists($controller,'index')) {
        $controller->index($url_output[1]);
    } else {
        $this->error();
    }
}

class Category
{
    function index($category)
    {

    }
}

次のように使用します: example.com/category/images

于 2012-08-08T19:49:45.207 に答える