0

MVC構造を使用してWebサイトを作成しています。以下は、クリーンURLを使用して適切なファイルをロードするために使用したコードです。ただし、これは最初のレベルでのみ機能します。

私が訪問したかったと言ってmywebsite.com/admin、それはうまくいくでしょう、しかしそうでmywebsite.com/admin/dashboardはありません。問題は配列にあります。2番目のレベルと2番目のレベルの後にコンテンツをロードするように配列を取得するにはどうすればよいですか。

このような配列を作成するのが最善でしょうか?

Array
     - controller
     - view
          - dashboard

ここでの助けは素晴らしいでしょう。副次的な質問としても。「カスタム」URLを設定するための最良の方法は何でしょうか。したがって、これをmywebsite.com/announcement挿入すると、コントローラーが取得されているかどうかが確認され、失敗した場合は、カスタムコンテンツ(「customs」フォルダー内の同じ名前のファイル)が取得されているかどうかが確認され、何も実行されない場合は404が実行されます。ページが見つかりません)これは優先度の高い質問ではありませんが、コードの動作に大まかに関連しているため、追加するのが最善だと思いました。

function hook() {
    $params = parse_params();
    $url = $_SERVER['REQUEST_URI'];
    $url = str_replace('?'.$_SERVER['QUERY_STRING'], '', $url);

    $urlArray = array();
    $urlArray = explode("/",$url);
    var_dump($urlArray);
    if (isset($urlArray[2]) & !empty($urlArray[2])) {
        $route['controller'] = $urlArray[2];
    } else {
        $route['controller'] = 'front'; // Default Action
    }
    if (isset($urlArray[3]) & !empty($urlArray[3])) {
        $route['view'] = $urlArray[3];
    } else {
        $route['view'] = 'index'; // Default Action
    }
    include(CONTROLLER_PATH.$route['controller'].'.php');
    include(VIEW_PATH.$route['controller'].DS.$route['view'].'.php');
    var_dump($route['controller']);
    var_dump($route['view']);
    var_dump($urlArray);
    var_dump($params);

    // reseting messages
    $_SESSION['flash']['notice'] = '';
    $_SESSION['flash']['warning'] = '';
}
// Return form array
function parse_params() {
    $params = array();
    if(!empty($_POST)) {
        $params = array_merge($params, $_POST);
    }
    if(!empty($_GET)) {
        $params = array_merge($params, $_GET);
    }
    return $params;
}
4

3 に答える 3

1

これを明確にできますか:「問題は配列にあります。2 番目のレベルと 2 番目のレベルの後に、配列にコンテンツをロードさせるにはどうすればよいでしょうか。」

私はあなたがこのことをどのように機能させたいのか理解できません。あなたのコードをチェックしましたが、動作します。$urlArray[1]たぶん、3 の代わりに 2を入れる必要がある$urlArray[2]のでしょうか? 配列の最初の要素はインデックス 0 です。

通常は次のようにします。

URL 形式:

/controller/action/param1/param2/...

-controller- should be a class. That class has a method/function called -action-.

ex. /shoes/show/121/   --> this will load controller shoes 
                           and execute the method/function show(121)
                           that will show the shoes that have the id 121 in the
                           database.

ex. /shoes/list/sport  --> this will load controller shoes
                           and execute function list('sport') that will list all
                           shoes in the sport category.

ご覧のとおり、コントローラーを 1 つだけロードし、そのコントローラーから関数を 1 つだけ実行すると、その関数は残りのパスを取得してパラメーターとして使用します。

1 つの URL に対して複数のコントローラーが必要な場合は、残りのコントローラーをメイン コントローラーからロードする必要があります。ほとんどの MVC (CodeIgniter など) は、URL ごとに 1 つのコントローラーのみをロードします。

2 番目の質問:

きれいな URL の最善の方法は、それらをデータベースに保存することです。これは、次のような URL を持つことができることを意味します。

/I-can-write-anything-here-No-need-to-add-ids-or-controller-names

次に、この URL を取得して db で検索し、この URL に必要な -controller- と -action- を取得します。

しかし、一般的な MVC フレームワークがこれを行うのをまだ見たことがありません。その理由は、データベースがテキストの一致に対して多くのクエリを取得し、処理が遅くなるためだと思います。

一般的な MVC フレームワークは次を使用します。

/controller/action/param1/param2

これには、URL からコントローラー/アクションを直接見つけることができるという利点があります。欠点は、次のような URL を取得することです。

/shoes/list/sport 
//when what you really want is
/shoes/sport 
//or just
/sport //if the website only sells shoes

これは、にリダイレクト/shoes/sportすることで修正できます/shoes/list/sport

独自の MVC を作成する場合は、OOP を使用する必要があります。そうでない場合は、すべてのアクション/関数が同じ名前空間にあるため、見苦しくなります。

于 2012-07-08T13:30:51.400 に答える
0

個人的には、存在する多くの PHP フレームワークのいずれかを使用することをお勧めします。これにより、ルーティングが処理され、アプリケーションの作成に集中できるようになります。CakePHP は、私がしばらく使用してきたもので、私の生活をとても楽にしてくれます。

于 2012-07-08T11:57:37.493 に答える
0

私がやること:

www.example.com/url/path/or/something のような URL を www.example.com/index.php?url=url/path/or/something にリダイレクトする .htaccess ファイルを作成します。 $_GET['url'] を簡単に爆発させることができます。第二に、ユーザーが入力したすべてのものが index.php にリダイレクトされるため、すべてを完全に制御できます。

必要に応じて、私の mvc (bitbucket) への URL をお送りしますので、私のやり方をご覧ください ;)

(他の人には申し訳ありませんが、自分のサイトの URL を公開するのは好きではありません)

編集:特定の質問をより正確にするために; すべてがindex.phpに送られ、要求されたURLを完全に制御できるため、問題は解決します。

于 2012-07-08T11:58:07.943 に答える