句法 Syntaxphp
參數 Parametersweb
Luthier CI更改CodeIgniter路由的行爲:正則表達式
您可使用三種類型的路由:api
AJAX路由進入api.php數組
雖然你能夠在 web.php
文件中定義AJAX路由,但最好這樣作 api.php
閉包
若是您使用相同的URL和相同的HTTP動詞定義兩條或更多路線,則第一條路線將被返回ALWAYS
Luthier CI容許您使用動詞GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS和TRACE定義HTTP路由:app
若是您使用過Laravel,那麼您將知道如何使用Luthier CI,由於它的語法是相同的。這是路線最簡單的例子:框架
Route::get('foo', 'bar@baz');
第一條路由是獲勝的路由 curl
其中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', [ (...) ]);
namespace屬性告訴CodeIgniter控制器所在的子目錄。(注意,這不是PHP名稱空間,它是目錄名稱)
// The controller is located in application/controllers/admin/Testcontroller.php Route::get('hello/world', 'testcontroller@index', ['namespace' => 'admin']);
使用該prefix屬性爲路由添加前綴:
// The URL will be 'admin/hello/world' instead of 'hello/world' Route::get('hello/world', 'testcontroller@index', ['prefix' => 'admin']);
您能夠(事實上,這是可取的)爲您的路線指定一個名稱。這將容許您從其餘地方調用它們:
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>
重複的名稱 ( Duplicated names )
您不能使用相同的名稱調用兩個或多個路由
您可使用該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'); });
資源路由容許您在單行上爲控制器定義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
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');
您可使用匿名函數(也稱爲閉包或lambda函數)而不是指向控制器,例如:
Route::get('foo', function(){ ci()->load->view('some_view'); });
要訪問匿名函數中的框架實例,請使用該ci()函數。
能夠在路線中定義參數,以便它們能夠是動態的。要將參數添加到路徑的某個段,請將其括起來{curly brackets}
Route::post('blog/{slug}', 'blog@post');
重複參數 ( Duplicated parameters )
您不能使用相同名稱調用兩個或多個參數
要建立可選參數,請?在關閉大括號以前添加一個:
Route::put('categories/{primary?}/{secondary?}/{filter?}', 'clients@list');
請注意,在定義第一個可選參數後,如下全部參數必須是可選的。
Routes generated automatically
生成的路由Luthier CI將爲您生成全部可選參數的完整路徑樹,所以您沒必要擔憂編寫除主要路徑以外的更多路徑。
您能夠將參數限制爲正則表達式:
// 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');
您可能須要在一組路由中定義一個參數,而後在全部子路由中均可以使用該參數,而沒必要在全部控制器中的全部方法的參數中定義它,這很繁瑣。考慮到這一點,Luthier CI提供了所謂的Sticky參數。粘性參數如下劃線(_
) 開頭並具備一些奇點:
考慮這個例子:
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'); } }