2

Symfony の Web サイトを閲覧していました。フレームワークが提供するすべての機能が必要だとはあまり感じませんでしたが、ルーティングの部分は気に入りました。このようにURLパターンを指定できます

/some/path/{info}

URL のwww.somewebsite.com/app.php/some/path/ANYTHING場合、この URL に固有の応答をクライアントに送信できるようになります。文字列 ANYTHING を使用して、GET パラメータと同様に使用することもできます。URL の app.php 部分を非表示にして、URL のようにするオプションもありますwww.somewebsite.com/some/path/ANYTHING。私の質問は、複雑なフレームワークなしでこれを行うための最良のアプローチは何ですか?

4

3 に答える 3

7

同じルーティング構文で独自のミニフレームワークを作成しました。これが私がすることです:

  1. MOD_REWRITEを使用して、私が呼び出す変数にパラメーター(など/some/path/{info})を格納します。$_GETparams

    RewriteRule ^(.+)(\?.+)?$ index.php?params=$1 [L,QSA]

  2. パラメータを解析し、次の関数を使用してグローバルに保存します。

public static function parseAndGetParams() {

        // get the original query string

        $params = !empty($_GET['params']) ? $_GET['params'] : false;

        // if there are no params, set to false and return
        if(empty($params)) {
            return false;
        }

        // append '/' if none found
        if(strrpos($params, '/') === false) $params .= '/';

        $params = explode('/', $params);
        // take out the empty element at the end
        if(empty($params[count($params) - 1])) array_pop($params);

        return $params;
    }
  1. 適切なページに動的にルーティングします。

    // get the base page string, must be done after params are parsed
    public static function getCurPage() {
        global $params;
    
        // default is home
        if(empty($params))
        return self::PAGE_HOME;
        // see if it is an ajax request
        else if($params[0] == self::PAGE_AJAX)
        return self::PAGE_AJAX;
        // see if it is a multi param page, and if not, return error
        else {
            // store this, as we are going to use it in the loop condition
            $numParams = count($params);
    
            // initialize to full params array
            $testParams = $params;
            // $i = number of params to include in the current page name being checked, {1, .., n}
            for($i = $numParams; $i > 0; $i--) {
                // get test page name
                $page = strtolower(implode('/', $testParams));
    
                // if the page exists, return it
                if(self::pageExists($page))
                    return $page;
    
                // pop the last param off
                array_pop($testParams);
            }
    
            // page DNE go to error page
            return self::PAGE_ERROR;
        }
    }
    

ここでのは、最も具体的なページから最も具体的でないページを探すことです。また、フレームワークの外部でのワークアウトにより完全な制御が可能になるため、どこかにバグがある場合は、それを修正できることがわかります。フレームワークで奇妙な回避策を探す必要はありません。

これ$paramsでグローバルになりました。パラメータを使用するページは、それを操作するために呼び出すだけ$params[X]です。フレームワークのないフレンドリーなURL。

次に、ページを追加する方法は、pageExists($page)呼び出しで確認される配列にページを配置することです。

AJAX呼び出しの場合、特別なIFを入力します。

// if ajax, include it and finish
if($page == PageHelper::PAGE_AJAX) {
    PageHelper::includeAjaxPage();
    $db->disconnect();
    exit;
}

そして出来上がり-あなた自身のマイクロルーティングフレームワーク。

于 2012-04-09T20:26:12.163 に答える
4

この記事http://net.tutsplus.com/tutorials/other/a-deeper-look-at-mod_rewrite-for-apache/をお勧めします。Apache mod_rewrite を使用した URL リライトを理解するには、PHP だけのフレームワークは必要ありません。また、これはフレームワークが実装する深さです

于 2012-04-09T19:59:20.173 に答える
2

問題は、ルーティングがフレームワーク内の複雑なものであることです。

おそらくあなたはSilexを見てください。Symfony2 Components に基づくマイクロフレームワークです。Symfony2 ほど大きくはありませんが、いくつかの機能を備えています。

于 2012-04-09T19:50:10.387 に答える