Luthier CI更改CodeIgniter路由的行爲:php
您可使用三種類型的路由:web
web.php
文件中定義AJAX路由,但最好這樣作
api.php
若是您使用相同的URL和相同的HTTP動詞定義兩條或更多路線,則第一條路線將被返回ALWAYS Luthier CI容許您使用動詞GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS和TRACE定義HTTP路由:正則表達式
若是您使用過Laravel,那麼您將知道如何使用Luthier CI,由於它的語法是相同的。這是路線最簡單的例子:api
Route::get('foo', 'bar@baz');
複製代碼
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()方法:app
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屬性爲路由添加前綴:curl
// 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>
複製代碼
您可使用該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');
複製代碼
要建立可選參數,請?在關閉大括號以前添加一個:
Route::put('categories/{primary?}/{secondary?}/{filter?}', 'clients@list');
複製代碼
請注意,在定義第一個可選參數後,如下全部參數必須是可選的。
您能夠將參數限制爲正則表達式:
// 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');
}
}
複製代碼