
こんにちは!
私たちは、「Bitrixがファイナライズされてもそれほど悪くない」というトピックに関する記事を続けています。
今回はurl_rewriteについて説明します。これは、現在のバージョンが完全ではないと思うからです。
そして、理想的なオプションはマイクロフレームでのルーティング、たとえばスリム(または同じルーメン)、一般的にはPSR-7の友達であると思います。
誰が気にし、猫の下に行きます。
興味のない人は、よく、自分で決める;-)
はじめに
実際、以前の記事は多かれ少なかれ抽象的でした(おそらく、 ジャガーノートに関する記事を除く)ので、この投稿では、より少ない理論とより多くのコードを書きます。
ジャガーノートと言えば
ドキュメントはすぐに作成されますが、残念ながらいくつかの障害があります。
- 時間
- リファクタリング
- 私はTDDが好きだったので、テストを書くまでリファクタリングは停止しました
- ライブラリの開発の方向性、判明したように、私はまだしなかった
しかし、これは「まったく異なる話」と言う方法なので、この記事の目的であるルーティングに戻りましょう。
BitrixによるUrlRewrite
ルーティングの順序は、シェムカによってよりよく表されていると思います(わかりやすく、明確に):

それはすべてどういう意味ですか:
bitrix / urlRewrite.phpを含める
ルーティングに携わるファイルを含めます(そう、だから誰もが理解したと思います)。
一般に、この項目(およびブロック図の上位のもの)は.htaccessのメリットです:
RewriteCond %{REQUEST_FILENAME} !-f # RewriteCond %{REQUEST_FILENAME} !-l # RewriteCond %{REQUEST_FILENAME} !-d # RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$ # RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
IISのrequest_uriを修正
この項目は、コード内のコメントから判断すると、一部のIISジャム(低品質のMS)の原因であり、私は気づいていませんが、ロジックは次のとおりです。
QUERY_STRINGの形式が「wtf = 404; http(s)://wtf.ru」の場合、すべてのGET要求パラメーターがクリアされ、この構造がアドレスから削除されます。
「何が起こるの?」という質問に答えられないので、次に進みます。
dbconn.phpを含める
ベースを接続します。
なんで? データベースへのクエリはこれ以上なく、作業はファイルシステムでのみ行われるため、明確ではありません。
もちろん、ファイルを操作するためのクラスの実装には該当しませんでしたが、データベースから何かが必要な場合、これはただ悲しいです:-(
デコード要求ページ(UTF-8用)
REQUEST_URIをエンコードするすべての名前から明らかです。
なんで? BitrixがWindows-1251を好むのはなぜですか? 手がかりはありません。 しかし、これは永遠に続きます(これはインサイダー情報です)。
/urlRewrite.phpを含める
実際には、ルーティングルール自体を接続します。
プロセスURL
少し奇妙なアクションですが、それでも次のことが起こります:
GETパラメーターSEF_APPLICATION_CUR_PAGE_URLがある場合、REQUEST_URIをその値と同等にし、すべての従属変数とグローバル配列($ _GET、$ _SERVER、...)を書き換えます
プロセスurlRewrite
そうそう!
彼に着いた。
実際に何が起こるか:
- ParsimパラメーターCONDITION。
- REQUEST_URIでCONDITIONをRULEに置き換えます
- ルーティングルールの変数を$ _GETおよび$ _REQUESTに追加します。
- 指定されたファイルが存在するかどうか、有効なパスがあるかどうか、管理ファイル(アップロード、bitrix、bitrix /サービス、bitrix / groupdavphp)であるかどうかを確認します。
- すべて問題なければ、接続します。
すでにすべてのパラメーターをグローバル変数に入れた後にチェックが行われることを混乱させますか?
多くの曖昧さ、なぜこれが行われ、そうでないのですか?
さて、多くのあいまいさがありますが、なぜこれがまったく行われているのですか?
それでは、完璧なスリムに移りましょう。
SlimによるUrlRewrite
このすばらしいフレームワークの仕組み:
$app = new \Slim\App(); $app->get('catalog/{sectionCode}/{elementCode}/', function(Request $request, Response $response) { // code }); $app->post('catalog/{sectionCode}/{elementCode}/', function(Request $request, Response $response) { // code }); $app->put('catalog/{sectionCode}/{elementCode}/', function(Request $request, Response $response) { // code }); $app->delete('catalog/{sectionCode}/{elementCode}/', function(Request $request, Response $response) { // code }); $app->run();
目的のルート、パラメーター、実装を使用して、目的のアクションに簡単かつ無制限に固執します。
JuhhernautによるUrlRewrite
さて、今私たちはそれをすべて混同しようとしています。
Slimからメソッドの指示とアクションの実際の実装を捨てます。代わりに、ファイルへのパスがあります。
最初に、ルートを実際の物理ファイルにリンクするための構文を示します(実際、これはマニュアルです)。
/* * */ include_once __DIR__.'/modules/olof.juggernaut/includeRewrite.php'; use Jugger\Context\Router; /** * * Slim'a , * , * */ $r = new Router(); /* * * , URL : "/catalog/section1/section2/element1/", * 'index.php': * - /catalog/section1/section2/element1/index.php * - /catalog/section1/section2/index.php * - /catalog/section1/index.php * - /catalog/index.php * * * GET REQUEST, * .. * * */ $r->runRecursive(); /* * * : * {nameParam}, * {nameParam:regExp} * 'regExp' - . , '\d+' '[0-9]+' */ $r->run( "/page/", "/page/index1.php" ); $r->run( "/page/{p1:[0-9]+}/{p2}", "/page/index2.php" ); $r->run( "/catalog/", "/catalog/index1.php" ); /* * */ $r->run( [ "/catalog/{sectionCode}/", "/catalog/{sectionCode}/{elementId:\d+}/", ], "/catalog/index2.php" ); /* * ?r=path/to/file */ $r->run("{r:.+}", "index.php"); /* * * * /bitrix/urlrewrite.php */ $r->end();
実際、ルートの実装がコンポーネントの良心に任されている場合、次の構成を規定するだけで十分です(はい、これも可能です;-))。
(new Router()) ->runRecursive() ->end();
このファイルは(できます)urlrewrite.phpを呼び出し、/ local /フォルダーにドロップし、ルートにある.htaccessファイルを変更する必要があります。
代わりに:
RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$ RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
登録する必要があります:
RewriteCond %{REQUEST_FILENAME} !/local/urlrewrite.php$ RewriteRule ^(.*)$ /local/urlrewrite.php [L]
そして実際にはすべて。 あなたのポケットにシンプルで直感的なルーティング。
参照:
ジャガーノート : github.com/irpsv/juggernaut.bitrix
ルーターの実装 : github.com/irpsv/juggernaut.bitrix/blob/master/olof.juggernaut/lib/Context/Router.php