tp5 1 框架路由操作 URL生成例項分析

2022-09-26 03:00:08 字數 4076 閱讀 7035

thinkphp支援路由url位址的統一生成,並且支援所有的路由方式,以及完美解決了路由位址的反轉解析,無需再為路由定義和變化而改變url生成。

如果你開啟了路由延遲解析,需要生成路由對映快取才能支援全部的路由位址的反轉解析。

url程式設計客棧生成使用\think\facade\url::build()方法或者使用系統提供的助手函式url(),引數一致:

url::build('位址表示式',['引數'],['url字尾'],['網域名稱'])

url('位址表示式',['引數'],['url字尾'],['網域名稱'])

對使用不同的路由位址方式,位址表示式的定義有所區別。引數單獨通過第二個引數傳入,假設我們定義了乙個路由規則如下:

route::rule('blog/:id','index/blog/read');

就可以使用下面的方式來生成url位址:

url::build('index/blog/read', 'id=5&name=thinkphp');

url::build('index/blog/read', ['id' => 5, 'name' => 'thinkphp']);

url('index/blog/read', 'id=5&name=thinkphp');

url('index/blog/read', ['id' => 5, 'name' => 'thinkphp']);

如果你的路由方式是路由到模組/控制器/操作,那麼可以直接寫

// 生成index模組 blog控制器的read操作 url訪問位址

url::build('index/blog/read', 'id=5&name=thinkphp');

// 使用助手函式

url('index/blog/read', 'id=5&name=thinkphp');

以上方法都會生成下面的url位址:

/index.php/blog/5/name/thinkphp.html

注意,生成方法的第乙個引數必須和路由定義的路由位址保持一致,如果寫成下面的方式可能無法正確生成url位址:

url::build('blog/read','id=5&name=thinkphp');

如果你的環境支援rewrite,那麼生成的url位址會變為:

/blog/5/name/thinkphp.html

如果你配置了:

'url_common_param'=>true

那麼生成的url位址變為:

/index.php/blog/5.html?name=thinkphp

不在路由規則裡面的變數會直接使用普通url引數的方式。

需要注意的是,url位址生成不會檢測路由的有效性,只是按照給定的路由位址和引數生成符合條件的路由規則。

如果你的路由位址是採用控制器的方法,並且路由定義如下:

// 這裡採用配置方式定義路由 動態註冊的方式一樣有效

route::get('blog/:id', '@index/blog/read');

那麼可以使用如下方式生成:

// 生成index模組 blog控制器的read操作 url訪問位址

url::build('@index/blog/read', 'id=5');

// 使用助手函式

url('@index/blog/read', 'id=5');

那麼自動生成的url位址變為:

/index.php/blog/5.html

如果你的路由位址是路由到類的方法,並且做了如下路由規則定義:

// 這裡採用配置方式定義路由 動態註冊的方式一樣有效

route::rule(['blog','blog/:id'],'\app\index\controller\blog@read');

如果路由位址是到類的方法,需要首先給路由定義命名標識,然後使用標識快速生成url位址。

那麼可以使用如下方式生成:

// 生成index模組 blog控制器的read操作 url訪問位址

url::build('blog?id=5');

url('blog?id=5');

那麼自動生成的url位址變為:

/index.php/blog/5.html

我們也可以直接使用路由位址來生成url,例如:

我們定義了路由規則如下:

route::get('blog/:id' , 'index/blog/read');

可以使用下面的方式直接使用路由規則生成url位址:

url::build('/blog/5');

那麼自動生成的url位址變為:

/index.php/blog/5.html

預設情況下,系統會自動讀取url_html_suffix配置引數作為url字尾(預設為html),如果我們設定了:

'url_html_suffix' => 'shtml'

那麼自動生成的url位址變為:

/index.php/blog/5.shtml

如果我們設定了多個url字尾支援

'url_html_suffix' => 'html|shtml'

則會取第乙個字尾來生成url位址,所以自動生成的url位址還是:

/index.php/blog/5.html

如果你希望指定url字尾生成,則可以使用:

url::build('index/blog/read', 'id=5', 'shtml');

url('index/blog/read', 'id=5', 'shtml');

預設生成的url位址是不帶網域名稱的,如果kxxyvvarut你採用了多網域名稱部署或者希望生成帶有網域名稱的url位址的話,就需要傳入第四個引數,該引數有兩種用法:

url::build('index/blog/read', 'id=5', 'shtml', true);

url('index/blog/read', 'id=5', 'shtml', true);

第四個引數傳入true的話,表示自動生成網域名稱,如果你開啟了url_domain_deploy還會自動識別匹配當前url規則的網域名稱。

例如,我們註冊了網域名稱路由資訊如下:

route::domain('blog','index/blog');

那麼上面的url位址生成為:

你也可以顯式傳入需要生成位址的網域名稱,例如:

url::build('index/blog/read','id=5','shtml','blog');

url('index/blog/read','id=5','shtml','blog');

或程式設計客棧者傳入完整的網域名稱

url::build('index/blog/read','id=5','shtml','blog.thinkphp.cn');

url('index/blog/read','id=5','shtml','blog.thinkphp.cn');

生成的url位址為:

也可以直接在第乙個引數裡面傳入網域名稱,例如:

url::build('index/blog/read@blog', 'id=5');

url('index/blog/read@blog', 'id=5');

url('index/blog/[email protected]', 'id=5');

支援生成url的錨點,可以直接在url位址引數中使用:

url::build('index/blog/read#anchor@blog','id=5');

url('index/blog/read#anchor@blog','id=5');

錨點和網域名稱一起使用的時候,注意錨點在前面,網域名稱在後面。

生成的url位址為:

有時候我們生成的url位址可能需要加上index.php或者去掉index.php,大多數時候系統會自動判斷,如果發現自動生成的位址有問題,可以直接在呼叫build方法之前呼叫root方法,例如加上index.php:

url::root('/index.php');

url::build('index/blog/read','id=5');

或者隱藏index.php:

url::root('/');

url::build('index/blog/read','id=5');

root方法只需要呼叫一次即可。

tp5 1 路由 URL生成

thinkphp支援路由url位址的統一生成,並且支援所有的路由方式,以及完美解決了路由位址的反轉解析,無需再為路由定義和變化而改變url生成。如果你開啟了路由延遲解析,需要生成路由對映快取才能支援全部的路由位址的反轉解析。url生成使用 think facade url build 方法或者使用系...

tp5 1框架學習之路由

路由 就是使用者訪問提前規定的控制器和方法,進行業務處理 tp預設提供了兩種路由規則 1.pathinfo模式 2.自定義路由規則模式 推薦 tp5.1的路由定義更加物件化,並且預設開啟路由 不能關閉 如果乙個url沒有定義路由,則預設採用pathinfo模式訪問 路由的相關配置解釋 是否強制使用路...

tp5 1 資料庫事務操作

使用事務處理的話,需要資料庫引擎支援事務處理。比如mysql的myisam不支援事務處理,需要使用innodb引擎。最簡單的方式是使用transaction方法運算元據庫事務,當閉包中的 發生異常會自動回滾,例如 db transaction function 也可以手動控制事務,例如 啟動事務 d...