路由 ( Routes )
內容 ( Contents )
- 介紹 Introduction
- 路由型別 Route types
- 句法 Syntax
- 名稱空間 Namespaces
- 字首 Prefixes
- 命名路線 Named routes
- 回撥為路線 Callbacks as routes
- 組 Groups
- 資源路線 Resource routes
- 預設控制器 Default controller
- 引數 Parameters
- 可選引數 Optional parameters
- 引數正規表示式 Parameter regex
- “粘性”引數 "Sticky" parameters
介紹 ( Introduction )
Luthier CI更改CodeIgniter路由的行為:
- 在CodeIgniter中,預設情況下,可以在任何HTTP謂詞下訪問路由。使用Luthier CI時,必須為每個路由定義接受的HTTP謂詞,並且任何與這些引數不匹配的請求都將生成404錯誤。
- 在CodeIgniter中,可以直接從URL訪問控制器,而無需定義路由。另一方面,使用Luthier CI,嘗試訪問未定義的路徑(即使URL與控制器的名稱和方法匹配)也會生成404錯誤。
- 在CodeIgniter中,路由引數是指向控制器的簡單正規表示式,在Luthier CI中,路由是一個獨立且唯一的實體,它包含定義明確的引數以及從中構建URL的能力。
- 在CodeIgniter中,您只能建立指向控制器的路由。使用Luthier CI,可以使用匿名函式作為控制器,甚至可以在不使用單個控制器的情況下構建完整的Web應用程式。
路由型別 ( Route types )
您可以使用三種型別的路由:
- HTTP routes: 它們在HTTP請求下訪問,並在application/routes/web.php檔案中定義
- AJAX routes: 它們僅在AJAX請求下訪問,並在application/routes/api.php檔案中定義
- CLI routes: 它們僅在CLI(命令列介面)環境下訪問,並在application/routes/cli.php檔案中定義
雖然你可以在
web.php
檔案中定義AJAX路由,但最好這樣做 api.php
如果您使用相同的URL和相同的HTTP動詞定義兩條或更多路線,則第一條路線將被返回ALWAYS Luthier CI允許您使用動詞GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS和TRACE定義HTTP路由:
句法 ( Syntax )
如果您使用過Laravel,那麼您將知道如何使用Luthier CI,因為它的語法是相同的。這是路線最簡單的例子:
Route::get('foo', 'bar@baz');
複製程式碼
其中foo是路徑的URL,bar @ baz是它所指向的控制器和方法(由@分隔)的名稱。通過使用get()您告訴Luthier CI 的方法,該路由將在GET請求下可用。
Luthier CI允許您使用動詞GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS和TRACE定義HTTP路由:
Route::post('foo', 'bar@baz');
Route::put('foo', 'bar@baz');
Route::patch('foo', 'bar@baz');
Route::delete('foo', 'bar@baz');
Route::head('foo', 'bar@baz');
Route::options('foo', 'bar@baz');
Route::trace('foo', 'bar@baz');
複製程式碼
此外,您可以將具有路徑屬性的陣列作為第三個引數傳遞(稍後解釋)。
Route::get('test', 'controller@method', ['prefix' => '...', 'namespace' => '...', (...)] );
複製程式碼
要在路由中接受多個HTTP謂詞,請使用以下match()方法:
Route::match(['GET', 'POST'], 'path', 'controller@method', [ (...) ]);
複製程式碼
名稱空間 ( Namespaces )
namespace屬性告訴CodeIgniter控制器所在的子目錄。(注意,這不是PHP名稱空間,它是目錄名稱)
// The controller is located in application/controllers/admin/Testcontroller.php
Route::get('hello/world', 'testcontroller@index', ['namespace' => 'admin']);
複製程式碼
字首 ( Prefixes )
使用該prefix屬性為路由新增字首:
// The URL will be 'admin/hello/world' instead of 'hello/world'
Route::get('hello/world', 'testcontroller@index', ['prefix' => 'admin']);
複製程式碼
命名路由 ( Named routes )
您可以(事實上,這是可取的)為您的路線指定一個名稱。這將允許您從其他地方呼叫它們:
Route::get('company/about_us', 'testcontroller@index')->name('about_us');
複製程式碼
要通過它的名稱獲取路由,請使用該route()函式,其第一個引數是路由的名稱,第二個可選引數是具有該路由的引數值的陣列。例如,要獲取上一個路由,只需寫route('about_us'):
// http://example.com/company/about_us
<a href="<?= route('about_us');?>">My link!</a>
複製程式碼
您不能使用相同的名稱呼叫兩個或多個路由
組 ( Groups )
您可以使用該group()方法建立路由組,其中第一個引數是它們共有的字首,第二個引數是具有子路由的匿名函式:
Route::group('prefix', function(){
Route::get('bar','test@bar');
Route::get('baz','test@baz');
});
複製程式碼
此外,可以為路由組分配共同的屬性。這是擴充套件語法的示例:
Route::group('prefix', ['namespace' => 'foo', 'middleware' => ['Admin','IPFilter']], function(){
Route::get('bar','test@bar');
Route::get('baz','test@baz');
});
複製程式碼
資源路由 ( Resource routes )
資源路由允許您在單行上為控制器定義CRUD操作(Create, Read, Update, Delete) 例:
Route::resource('photos','PhotosController');
複製程式碼
生產:
[Name] [Path] [Verb] [Controller action]
photos.index photos GET PhotosController@index
photos.create photos/create GET PhotosController@create
photos.store photos POST PhotosController@store
photos.show photos/{id} GET PhotosController@show
photos.edit photos/{id}/edit GET PhotosController@edit
photos.update photos/{id} PUT, PATCH PhotosController@update
photos.destroy photos/{id} DELETE PhotosController@destroy
複製程式碼
此外,可以建立部分資源路由,傳遞第三個引數,其中包含要過濾的運算元組:
Route::resource('photos','PhotosController', ['index','edit','update']);
複製程式碼
生產:
[Name] [Path] [Verb] [Controller action]
photos.index photos GET PhotosController@index
photos.edit photos/{id}/edit GET PhotosController@edit
photos.update photos/{id} PUT, PATCH PhotosController@update
複製程式碼
預設控制器 ( Default controller )
Luthier CI自動設定使用URL / 和HTTP謂詞 GET 定義的任何路由作為預設控制器,但是您可以使用 set()
方法和這種特殊語法顯式設定它:
// Note that the value is binded to the special 'default_controller' route of CodeIgniter and you must
// use the native syntax:
Route::set('default_controller', 'welcome/index');
複製程式碼
回撥為路線 ( Callbacks as routes )
您可以使用匿名函式(也稱為閉包或lambda函式)而不是指向控制器,例如:
Route::get('foo', function(){
ci()->load->view('some_view');
});
複製程式碼
要訪問匿名函式中的框架例項,請使用該ci()函式。
引數 ( Parameters )
可以在路線中定義引數,以便它們可以是動態的。要將引數新增到路徑的某個段,請將其括起來{curly brackets}
Route::post('blog/{slug}', 'blog@post');
複製程式碼
您不能使用相同名稱呼叫兩個或多個引數
可選引數 ( Optional parameters )
要建立可選引數,請?在關閉大括號之前新增一個:
Route::put('categories/{primary?}/{secondary?}/{filter?}', 'clients@list');
複製程式碼
請注意,在定義第一個可選引數後,以下所有引數必須是可選的。
生成的路由Luthier CI將為您生成所有可選引數的完整路徑樹,因此您不必擔心編寫除主要路徑之外的更多路徑。
引數正規表示式 ( Parameter regex )
您可以將引數限制為正規表示式:
// These are the equivalents of (:num) and (:any), respectively:
Route::get('cars/{num:id}/{any:registration}', 'CarCatalog@index');
複製程式碼
此外,您可以使用具有以下{([expr]):[name]}語法的自定義正規表示式:
// This is equivalent to /^(es|en)$/
Route::get('main/{((es|en)):_locale}/about', 'about@index');
複製程式碼
“粘性”引數 ( "Sticky" parameters )
您可能需要在一組路由中定義一個引數,然後在所有子路由中都可以使用該引數,而不必在所有控制器中的所有方法的引數中定義它,這很繁瑣。考慮到這一點,Luthier CI提供了所謂的Sticky引數。粘性引數以下劃線(_
) 開頭並具有一些奇點:
- 它不會傳遞給路徑指向的控制器方法的引數。
- 在共享粘合劑引數的所有子路徑中,將從URL中獲取值,並將在route()函式中自動提供,因此您可以省略它,或覆蓋任何其他值。
考慮這個例子:
Route::group('shop/{_locale}', function()
{
Route::get('category/{id}', 'ShopCategory@categoryList')->name('shop.category');
Route::get('product/{id}/details', 'ShopProduct@details')->name('shop.product.details');
});
複製程式碼
路由shop.category並shop.product.details共享_locale粘性引數。雖然該引數必須位於URL中,但route()在此上下文中使用該函式時,並不強制它出現在引數值陣列中。當您需要連結到當前路徑的其他變體時,這尤其有用:
// If the URL is 'shop/en/category/1', {_locale} will be 'en' here:
echo route('shop.category', ['id' => 1]); # shop/en/category/1
echo route('shop.category', ['id' => 2]); # shop/en/category/2
echo route('shop.category', ['id' => 3]); # shop/en/category/3
// You can overwrite that value for any other:
echo route('shop.category', ['_locale' => 'es', 'id' => 1]); # shop/es/category/1
複製程式碼
粘性引數的一個優點是您不必將它們定義為指向控制器的所有方法的引數。在前面的示例中,在ShopCategory和ShopProduct控制器中,它們的方法將只有一個引數:$id,因為它是路由器提供的唯一引數:
<?php
# application/controllers/ShopCategory.php
defined('BASEPATH') OR exit('No direct script access allowed');
class ShopCategory extends CI_Controller
{
// Define the method as categoryList($_locale, $id) will not work: it is
// waiting for exactly 1 argument:
public function categoryList($id)
{
}
}
複製程式碼
<?php
# application/controllers/ShopProduct.php
defined('BASEPATH') OR exit('No direct script access allowed');
class ShopProduct extends CI_Controller
{
// Same here:
public function details($id)
{
}
}
複製程式碼
要獲取sticky引數的值,請使用控制器中屬性的param()方法route:
<?php
# application/controllers/ShopCategory.php
defined('BASEPATH') OR exit('No direct script access allowed');
class ShopCategory extends CI_Controller
{
public function categoryList($id)
{
$locale = $this->route->param('_locale');
}
}
複製程式碼