0

より高度なプログラミングを学ぶ手段として、php で独自の MVC フレームワークを作成しています。フレームワークを起動して実行していますが、現在のルーティング方法に関して問題があります。フロントエンド Web サイトを補完するために、フレームワークがバックエンド cms をサポートすることを望みます。問題は、ルーティング構造がそのように機能することです-mywebsite.com/controller/method/id ルーティングエンジンは情報を次のような配列にソートします

segments 0 => controller, 1 => method, 2 => id

現在、mywebsite.com/projects にアクセスすると、管理ページとして設定したページに移動します。これに mywebsite.com/admin/projects からのみアクセスできるようにしたいだけでなく、mywebsite.com/projects からフロントエンドに移動できるようにしたいと考えています。

したがって、アクセスしたい場合はmywebsite.com/projects、「フロント」コントローラーをレンダリングして、「プロジェクト」をメソッドにプッシュしたいと思います。私が訪問mywebsite.com/admin/projectsした場合、プロジェクトコントローラーをロードしたいと思います。

現在のルーティング クラス全体は次のとおりです。

<?php

class Request {

    //url domain.com/controller/method/other
    //holds url segments 0 => controller, 1 => method, 2 => other, etc
    public $segments;
    function  __construct() {
        $this->parse_globals();
    }

    function parse_globals(){
        //$uri = preg_replace("|/(.*)|", "\\1", str_replace("\\", "/", $_SERVER['REQUEST_URI']));
        $uri = (empty($_GET['rt'])) ? '' : $_GET['rt'];
        $this->segments = array_filter(explode('/', $uri));
        if (in_array("admin", $this->segments)) {
            array_shift($this->segments);
        }
        print_r($this->segments);
        //remove index php
        if( reset($this->segments) == 'index.php') {
            array_shift ($this->segments);
        }
    }

    function controller(){
        return $this->segment(0);
    }

    function method(){
        return $this->segment(1);
    }

    function param( $str ){
        return isset($_REQUEST[$str]) ? $_REQUEST[$str] : false;
    }

    function segment( $no ){
        return isset($this->segments[$no]) ? $this->segments[$no] : false;
    }
}
4

3 に答える 3

4

URL のセグメントを単純に区切る代わりにexplode()、一連の正規表現パターンを使用できます。

たとえば、次のパターンは firstsactionで一致を試み、action存在する場合はそのcontroller前に setがあるかどうかを確認します。

'/(:?(:?\/(?P<controller>[^\/\.,;?\n]+))?\/(?P<action>[^\/\.,;?\n]+))?/'

PHP フレームワークのほとんどは、簡略化された表記法を使用して、さまざまな方法でそのようなパターンを生成します。このようにして、各パターンのどの部分が必須で、どの部分がオプションかを設定できます。また、オプションパーツにフォールバック値を提供することも可能です。

それは言った...

cms のような複雑なものをフレームワークで作成する前に、OOP の調査にさらに時間を費やすことができます。少なくとも、Miško Hevery と Robert C. Martin の講義を視聴することをお勧めします。クラスの書き方を知っているからといって、オブジェクト指向プログラミングを理解しているとは限りません。

アップデート

この回答にはいくつかの資料をリストしました。役に立つかもしれませんが、

さらに、上記の回答に含まれていない 2 つの講義があります。

于 2012-08-02T04:07:21.990 に答える
1

私の理解では、ルーティングには 3 つのケースがあります。

基本的なもの:

/<controller>/<action>/<parameters>    

管理パネル用の特別なもの (「管理者」は別のモジュールのようなものです):

/<module>/<controller>/<action>/<parameters>

最後に、「/front/projects」にマップされる「/projects」の特殊なケースです。

その場合、ルーティング クラスをより柔軟にして、あらゆる種類のルーティング スキームを処理できるようにする必要があります。Kohana のようなフレームワークでは、これは次のようなルールで行われます。

Route::set('adminModule', 'admin/projects')
    ->defaults(array(
        'controller' => 'projects',
        'action'     => 'admin',
    ));

Route::set('projectPage', 'projects')
    ->defaults(array(
        'controller' => 'front',
        'action'     => 'projects',
    ));

Route::set('default', '(<controller>(/<id>(/<action>)))')
    ->defaults(array(
        'controller' => 'index',
        'action'     => 'index',
    ));

明らかにこれは単なる例ですが、アイデアはわかります。基本的に、適切なデフォルト ルーティング (コントローラー/アクション/ID など) を提供する必要がありますが、ユーザーが他のルートを構成できるようにする必要もあります。

于 2012-08-02T03:29:32.973 に答える