ThinkPHP6.0研究ノートルーティング操作

ThinkPHPルーティング

作成者:MirrorWang Yuyang

Thinkphpルーティングの主な機能は、URLアドレスをより美しく、簡潔でエレガントにすることです...;ルートを設定すると、URLの検出、検証、その他の操作に非常に便利です;ルーティング機能はデフォルトの開いているconfig/app.phpファイルで設定されます:

'with_route'	=>	true;
  • ルーティング構成ファイル:config/route.php

  • ルート定義ファイル:route/app.php

ルートディレクトリ内の定義ファイルのファイル名はランダムで有効です。

ルート定義

ルーティングテストファイルを定義します。Address.php

class Address
{
    public function index()
    {
        return 'index';
    }
    public function details($id)
    {
        return 'details目前调用的ID'.$id;
    }
}
  • ルーティングルールが定義されていない場合、デフォルトのURLアクセス方法

    http://xxx.com/Index.php/address/id/5
    
  • URLルーティングルールをroute/app.php定義し、定義ファイル構成する

    Route::rule('details/:id','Address/details')
    
    http://xxx.com/Index.php/details/5
    

    ルーティングルールを構成したら、ルーティングルールを使用してそれらにアクセスする必要があります。それ以外の場合は、不正なリクエストと見なされます。


ルート定義の登録

Route::rule('路由表达式','路由地址','请求类型')

ルーティング式:ルーティングアクセスルールを参照します

ルーティングアドレス:アクセスターゲットのアドレスを参照します(コントローラー/メソッド/パラメーター)

要求タイプ:デフォルト->任意

タイプ 説明文 ショートカット方法
取得する GETリクエスト 取得する
役職 POSTリクエスト 役職
プット PUTリクエスト プット
削除 DELETEリクエスト 削除する
パッチ PATCHリクエスト パッチ
* 任意のリクエストタイプ どれか

ショートカット登録ルートの定義

Route::[快捷方法名]('路由表达式','路由地址')

例:

Route::rule('details/:id','Address/details')
    
URL:http://xxx.com/Index.php/details/5

ruleルートをAddressコントローラーに登録details

必須ルーティング:必須ルーティングが有効になっています。すべてのアクセスはルーティングアクセスルールに従う必要があります。それ以外の場合はエラーが報告されます。

// 是否强制使用路由
'url_route_must'        => true,

ホームページのルーティング設定:(バックスラッシュはホームページのアドレスです)

Route::rule('/','Index/index');

閉鎖サポート

クロージャーにより、コントローラーメソッドを必要とせずに、URLを介して直接実行できます。

Route::get('think', function () {
    return 'hello,ThinkPHP6!';
});
Route::get('think', function ($id) {
    return 'hello!'.$id;
});

ルーティングルール式

ルール式には通常、静的ルール動的ルール、および2つのルールの組み合わせが含まれます。たとえば、以下はすべて有効なルール式です。

// 静态路由
Route::rule('ads','Address/index');
[URL]=> tp/Index.php/ads
// 静态+动态路由
Route::rule('datails/:id','Address/details');
[URL]=> tp/Index.php/details
// (多参数)静态+动态路由
Route::rule('search/:id/:uid','Address/search');
[URL]=> tp/Index.php/search/1/1
// 全动态地址 不会限制search参数固定
Route::rule(':search/:id/:uid','Address/search');
[URL]=> tp/Index.php/search/1/1
[URL]=> tp/Index.php/s/1/1
// 可选参数地址
Route::rule('blog/:year/[:month]','Address/blog');
// 完全匹配地址
Route::rule('search/:id/:uid$','Address/search');
[URL]=> tp/Index.php/search/1/1
    
//在路由配置文件中可以开启全局路由完全匹配
//开启完全匹配后,使用`completeMatch(false)`关闭
// 额外参数 (隐式传值)
// 路由跳转支持传入不显示在URL中参数
Route::rule('blog/:id','blog/read')
    ->append(['status'=>1,'app_id'=>5]);

ルート識別

ルートに基づいてURLアドレスを生成し、ルートを定義するときに一意の識別子を指定します

// 定义标识
Route::rule('blog/:year/:month','Adderss/blog')
    ->name('route_blog');
return url('route_blog',
	['year'=>$year,'month'=>$month]
);

可変ルール

システムのデフォルトのルーティング変数ルールは\w+です。変数ルールはルーティング構成ファイルで変更できます

pattern()メソッドを使用して、パラメーター変数のルールを設定できます。

Route::rule('details/:id','Address/details')
    ->pattern(['id'=>'\d+']);

pattern()配列転送の受信、複数のパラメーター変数を設定するためのルールのサポート

Route::pattern([
   'id'		=>	'\d+',
   'uid'	=>	'\d+'
]);

上記の方法を使用して、ルーティング定義ファイルでグローバルルールを定義できます。

ルーティング計画を達成するための結合された変数ルールの使用をサポートします。

Route::rule('details-<id>','Address/details')
    ->pattern('id','\d+');

動的組み合わせアセンブリ:

Route::rule('details-:name-:id','Hello:name/index')
    ->pattern('id','\d+')

ルーティングアドレス

ルーティングアドレスは通常、次のとおりです。控制器/操作方法

Route::rule('/','Index/index.php');

マルチレベルコントローラ、ルーティングアドレス

Route::rule('details/:id','group.Blog/details');

フルパスの操作方法:完整类名@操作方法

静的メソッドのアドレス操作:完整类名::静态方法

ルーティングを::readirect()使用してリダイレクトを行う方法


ルーティングパラメータ

ルートを設定するときに、関連するメソッドを設定して、一致の検出と動作の実行を実装できます

パラメータ 解説 メソッド名
ext URLサフィックスの検出、複数のサフィックスのマッチングのサポート ext
deny_ext URLはサフィックスの検出を禁止し、複数のサフィックスのマッチングをサポートします denyExt
https httpsリクエストかどうかを確認する https
ドメイン ドメイン名の検出 ドメイン
complete_match ルートを完全に一致させるかどうか completeMatch
モデル バインディングモデル モデル
キャッシュ リクエストキャッシュ キャッシュ
ajax Ajax検出 ajax
pjax Pjax検出 pjax
json JSON検出 json
検証 データ検証のためにバリデータークラスをバインドします 検証
追加する 追加のパラメーターを追加する 追加する
ミドルウェア ルーティングミドルウェアの登録 ミドルウェア
フィルタ 変数フィルタリングのリクエスト フィルタ

extこのメソッドは、URLサフィックスを検出することです

Route::rule('details/:id','Address/details')->ext('html');

httpshttpsリクエストかどうかを検出するメソッド

Route::rule('details/:id','Address/details')
    ->https()
    ->ext('html');

ルーティングパラメータを一括で設定する必要がある場合は、このoption方法も使用できます

Route::get('new/:id', 'News/read')
    ->option([
        'ext'   => 'html',
        'https' => true
    ]);

ドメイン名ルーティング

ルーティングを特定のドメイン名に制限する

Route::domain('baidu.com',function(){
    Route::rule('blog/:id','Address/blog')
})

ドメイン名ルーティングはルーティングパラメータ操作をサポートします

クロスドメインリクエスト

ブラウザーのセキュリティメカニズムは、非相同(クロスドメイン)リクエストをインターセプトします; Thinkphpルーティングでは、それはallowCrossDomain()クロスドメインリクエストを実装するために使用されます。設定後、ルートは非相同リクエストを許可します:

Route::rule('details/:id'.'Address/details')
    ->allowCrossDomain();

同時に、セキュリティ上の理由から(誰もが私のところに来ることができるわけではありません)、指定されたクロスサイトリクエストの制限をサポートしています。

Route::rule('details/:id'.'Address/details')
    ->allowCrossDomain([
        'Access-Control-Allow-Origin' => "http://baidu.com"
    ]);

ルーティングパケット

ルートのグループ化、同じプレフィックスを持つルートをグループに結合し、ルートの定義を簡略化すると、照合とメンテナンスが容易になります。

group()パケットルーティング登録に使用

Route::group('address',function(){
    Route::rule(':id','Address/details'),
    Route::rule(':name','Address/search');
})->pattern(['id'=>'\d+','name'=>'\w+']);

group()の最初のパラメータは省略できます。最初のパラメータは、ルートに共通のルート設定パラメータを設定するだけです。最初のパラメータを追加するとルーティングルールの内容を省略できます。上記と次の2つのプログラムは効果がありますが、省略した場合ルール名、アクセス違反が発生します。これはpattern()、各パラメーターの受信範囲制限するために必要なため、推奨される省略形ではありません。個人的にグループ化するには、次の方法をお勧めします。

Route::group('add',function(){
    Route::rule('de/:id','Address/details'),
    Route::rule('se/:name','Address/search');
});
[URL] => tp/Index.php/add/de/1

prefix()グループアドレスを省略できるコントローラーを使用する

Route::group('add',function(){
    Route::rule('de/:id','details'),
    Route::rule('se/:name','search');
})->prefix('Address/');

ルーティングルールは、特にルーティングルールが特に大きい場合、解析中により多くのメモリリソースを消費します。

ここで遅延解決をオンにして、メモリスペースを節約できます(ルーティングは、一致する場合にのみ実行されます)

MISSルーティング

グローバルMISS:必須のルーティング機能を有効にするのと同様に、対応するルールが一致しない場合、自動的にMISSにジャンプします。

Route::miss('public/miss');
// 闭包
Route::miss(function(){
    return '404 Not Found!';
});

部分的/グループミス:グループ化で使用され、一致ルールを満たさない場合はグループ化に調整されます

Route::group('add',function(){
    Route::rule('de/:id','details'),
    Route::rule('se/:name','search'),
    Route::miss('miss')
})->prefix('Address/');

ドメイン名MISSルーティング:このルートをサポートして、個別のMISSルーティングをセットアップします

Route::domain('blog', function () {
    // 动态注册域名的路由规则
    Route::rule('new/:id', 'news/read');
    Route::rule(':user', 'user/info');
    Route::miss('blog/miss');
});

リソースのルーティング

リソースルーティング:固定された共通メソッドを採用して、URLを簡略化する機能を実現します。

リソースルートを作成する

Route::resource('[资源规则名]','[访问路径]');
class Address
{
    public function index()
    {
        return 'index';
    }
    public function details($id)
    {
        return 'details目前调用的ID=>'.$id;
    }
    public function search($name)
    {
        return "Name => ".$name;
    }
    public function blog($year,$month)
    {
        return url('route_blog',['year'=>$year,'month'=>$month]);
    }
}

Addressリソースコントローラーを作成したら、ルート定義ファイルにリソースルートを登録します

Route::resource('add','Address');

リソースルートが正常に登録されると、メソッドのマッチングが自動的に完了します。

index==> Address/index->インデックス

details==> Address/details->詳細/:id

search==> Address/search-> search /:name

blog==> Address/blog-> blog /:年/:月

vars()デフォルトのパラメータ名を変更し、使用して、デフォルトのパラメータ$id名を

Route::resource('add','Address')
    ->vars(['add'=>'add_id']);

コントローラーで適宜変更する必要があります

only()システムが提供するリソースを制限する

Route::resource('add','Address')
    ->only(['index','search','blog']);

except()システムが提供するリソースを排除する方法

Route::resource('add','Address')
    ->except(['index']);

rest()システムのデフォルトのメソッドを変更する(要求メソッド、アドレス、操作)

Route::rest('create',['GET','/:id/add','add'])

ネストされたリソースルーティング

……

注釈ルーティング

ルーティングアノテーションメソッドは、デフォルトではシステムでサポートされていません。拡張機能をインストールする必要があります。

composer require tohthink/think-annotation

関連するライブラリを紹介します。use think\annotation\Route

簡単な紹介の後、コントロール側でコメントコードを設定し、PHPDOCを使用して段落を生成し、ルーティングルールを追加できます。

/**
 * @parom $id
 * @return string
 * @route("details/:id");
 */

注釈モードは、リソースルーティングをサポートします。

use think\annontation\Route\Resource;
/**
 * @Resource("blog")
 */

注釈モードはグループ化をサポートします:

use think\annontation\route\Group;
/**
 * @Group('ads')
 */

URL生成

Route::buildUrl()URLを使用してルートを取得する

Route::buildUrl('地址',[参数]……)
public function details($id)
{
	return Route::buildUrl('Url/details',['id'=>$id]);
}

ルートにエイリアスが定義されている場合は、そのエイリアスをbuildUrl()使用できます

同時に、url()代わりにヘルパー関数を使用できます

おすすめ

転載: www.cnblogs.com/wangyuyang1016/p/12739445.html
おすすめ