ホームページ >バックエンド開発 >PHPチュートリアル >php フレームワークの実装方法 連載記事 [4] URL ルーティング管理
($ CTL) 関数 ($ ACT)
, _u=$ctl .$act
イージーモード_easy=$app.$tpl。 $ctl.$act
_easy=$app.$ctl.$act
_Web 開発では、通常、フロントエンド ページを次のように出力します。 $act, $act 処理関数が実装されていない場合は、対応するフロントエンド テンプレート ファイルが自動的に検索されて表示されます。
このルーティング モードは、単純な表示ページに適しています
URL 書き換えモード (nginx または Apache の設定が必要)
a pache : ^rewrite[./](.*)$ /index. =$1 [R,QSA]
nginx: 書き換え ^/rewrite[./](.*)$ /index.php?_rewrite=$1 last;
書き換えます。{$app}.{$ ctl}。 {$ act}。{$ params}.html
tまたはよりエレガントなディレクトリアクセス方法format は、urlencode の後のパラメータ リストです sp_uid=1&d=1.2&p=sb を渡す場合は、 $params = sp_uid%3D1%26d%3D1.2%26p%3Ds %2Fbまたは sp_uid/1/d/1.2 /p/sb
このモードは、?& 特殊文字を URL に含めることができない一部のシナリオで使用できます
1. qq oauth2 検証を通じてログインするには、書き換えルールを設定する必要があります
rwrite .thirdlogin.index.qcallback.sp_uid%3d1.php
ペイバック I REWRITE.PAY.WEIXIN.NATIVE2_NOTIFY.PHP
4.
実装コードの一部 现 现 现
1
2
3
5 6 7 8 9 10 11 12 13
$a = (! 空 ( $_REQUEST [ '_a' ]) && is_string ( $_REQUEST [ '_a' ])) ? $_REQUEST [ '_a' ] : 'web' ; preg_match( '/^[w.]+ $/ ' , $a )) { exit ( '無効な _app 名! ' .htmlspecialchars( $a )) } } | $GLOBALS [ '_UCT' ][ 'APP' ] = ! ? strto lower ( $a ) : 'ウェブ' ; ] : 'index.index' ; if (!preg_match( '/^[w.]+$/' , $u )) { exit ( 'invalid _url name! ' . htmlspecialchars( $u )); } $u = 爆発 ( '.' , $u , 2); $GLOBALS [ '_UCT' ][ 'CTL' ] = !空 ( $u [ '0' ]) ? strto lower ( $u [ '0' ]) : 'インデックス' ; $GLOBALS [ '_UCT' ][ 'ACT' ] = !空 ( $u [ '1' ]) ? strto lower ( $u [ '1' ]) : 'インデックス' ; |
イージーモード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//イージーモードでテンプレート tpl に直接アクセス if (! empty ( $_REQUEST [ '_easy' ]) && is_string ( $_REQUEST [ '_easy' ])) { $easy =explode ( '.' , $_REQUEST [ '_easy' ]); switch ( count ( $easy )) { if (preg_match( '/^[w.]+$/' , $easy [1])) { $ _GET [ '_a' ] = $_REQUEST [ ' _a' ] = $easy u' ] = $_REQUEST [ '_u' ] = $easy [1] '.' ケース 2: _GET [ ' _u' ] = $_REQUEST [ '_u' ] = $easy [1] ケース 1: ; $_GET [ '_a' ] = $_REQUEST [ '_a' ] = $easy [0]; 休憩 ; デフォルト : exit ( 'invalid _easy param! ' . htmlspecialchars( $_REQUEST [ '_easy' ])); } } |
書き換えモード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
// URL 書き換えモード if (! empty ( $_REQUEST [ '_rewrite' ]) && is_string ( $_REQUEST [書きます' ])) { UEST [ '_rewrite ' ] = urldecode( substr ( $_SERVER [ 'QUERY_STRING' ], '_ rewrite=' )))) _REQUEST [ '_rewrite' ], 0, strrpos ( $_REQUEST [ '_rewrite' ], '.' ));
//3. 区切り文字として / をサポートします strlen ( $rewrite ); { sp = $ [ $i ] を書き換えます } } $rewrite = 爆発 ( $sp , $rewrite , 4); //最終段は必充填後缀名 switch ( count ( $rewrite )) { case 3: case 4: { $_GET [ '_a' ] = $_REQUEST [ '_a' ] = $rewrite [0]; $_GET [ '_u' ] = $_REQUEST [ '_u' ] = $rewrite [1]。 「。」 。 $rewrite [2]; if (! empty ( $rewrite [3])) { if ( strpos ( $rewrite [3], '/' )) { $params = 爆発 ( '/' , $rewrite [3]) ;for ( $i =0; $i +1< count ( $params ); $i +=2) { $_REQUEST [urldecode( $params [ $i ])] = urldecode( $params [ $i +1]); } } その他 { foreach (explode ( '&' , $rewrite [3]) as $p ) { list( $k , $v ) = explode ( '=' , $p , 2); $_REQUEST [urldecode( $k )] = urldecode( $v ); } } }休憩 ; } ケース 2: $_GET [ '_a' ] = $_REQUEST [ '_a' ] = $rewrite [0]; $_GET [ '_u' ] = $_REQUEST [ '_u' ] = $rewrite [1]; 休憩 ; ケース 1: $_GET [ '_a' ] = $_REQUEST [ '_a' ] = $rewrite [0]; 休憩 ; デフォルト: ブレーク ; } } |