Luthier CI 路由 Routes

路由 ( Routes )

內容 ( Contents )

  1. 介紹 Introduction
  2. 路由類型 Route types
  3. 句法 Syntaxphp

    1. 命名空間 Namespaces
    2. 前綴 Prefixes
    3. 命名路線 Named routes
    4. 回調爲路線 Callbacks as routes
    5. Groups
    6. 資源路線 Resource routes
    7. 默認控制器 Default controller
  4. 參數 Parametersweb

    1. 可選參數 Optional parameters
    2. 參數正則表達式 Parameter regex
    3. 「粘性」參數 "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 )

您可使用三種類型的路由:api

  • HTTP routes: 它們在HTTP請求下訪問,並在application/routes/web.php文件中定義
  • AJAX routes: 它們僅在AJAX請求下訪問,並在application/routes/api.php文件中定義
  • CLI routes: 它們僅在CLI(命令行界面)環境下訪問,並在application/routes/cli.php文件中定義

AJAX路由進入api.php數組

雖然你能夠在 web.php 文件中定義AJAX路由,但最好這樣作 api.php閉包

若是您使用相同的URL和相同的HTTP動詞定義兩條或更多路線,則第一條路線將被返回ALWAYS
Luthier CI容許您使用動詞GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS和TRACE定義HTTP路由:app

句法 ( Syntax )

若是您使用過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', [ (...) ]);

命名空間 ( 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>

重複的名稱 ( Duplicated names )

您不能使用相同的名稱調用兩個或多個路由

組 ( 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');

重複參數 ( Duplicated parameters )

您不能使用相同名稱調用兩個或多個參數

可選參數 ( Optional parameters )

要建立可選參數,請?在關閉大括號以前添加一個:

Route::put('categories/{primary?}/{secondary?}/{filter?}', 'clients@list');

請注意,在定義第一個可選參數後,如下全部參數必須是可選的。

Routes generated automatically

生成的路由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');
    }
}
相關文章
相關標籤/搜索