[TOC]
# 路由
路由器組件允許您定義映射到應接收請求的控制器或處理程序的路由。路由器只是解析URI以確定此信息。路由器有兩種模式:MVC模式和僅匹配模式。第一種模式非常適合使用MVC應用程序。
## 默認路由
`Phalcon\Mvc\Router` 提供高級路由功能。
在MVC模式下,您可以定義路由并將它們映射到您需要的控制器/操作。路由定義如下:
```php
<?php
use Phalcon\Mvc\Router;
// Create the router
$router = new Router();
// Define a route
$router->add(
'/admin/users/my-profile',
[
'controller' => 'users',
'action' => 'profile',
]
);
// Another route
$router->add(
'/admin/users/change-password',
[
'controller' => 'users',
'action' => 'changePassword',
]
);
$router->handle();
```
`add()` 方法的第一個參數是您要匹配的模式,可選地,第二個參數是一組路徑。在這種情況下,如果URI是`/admin/users/my-profile`,則將執行`users`控制器的 `profile` 操作。重要的是要記住路由器不執行控制器和操作,它只收集此信息以通知正確的組件(即`Phalcon\Mvc\Dispatcher`)這是它應該執行的控制器/操作。
應用程序可以有許多路徑,逐個定義路由可能是一項繁瑣的任務。在這些情況下,我們可以創建更靈活的路由:
```php
<?php
use Phalcon\Mvc\Router;
// Create the router
$router = new Router();
// Define a route
$router->add(
'/admin/:controller/a/:action/:params',
[
'controller' => 1,
'action' => 2,
'params' => 3,
]
);
```
在上面的示例中,我們使用通配符來使路由對許多URI有效。例如,通過訪問以下URL(`/admin/users/a/delete/dave/301`)將產生:
| Controller | Action | Parameter | Parameter |
|:----------:|:------:|:---------:|:---------:|
| users | delete | dave | 301 |
`add()`方法接收一個模式,該模式可以選擇具有預定義的占位符和正則表達式修飾符。所有路由模式必須以正斜杠字符(`/`)開頭。使用的正則表達式語法與[PCRE正則表達式](http://www.php.net/manual/en/book.pcre.php)相同。請注意,沒有必要添加正則表達式分隔符。所有路由模式都不區分大小寫。
第二個參數定義匹配的部分應如何綁定到控制器/動作/參數。匹配部分是由括號(圓括號)分隔的占位符或子圖案。在上面給出的示例中,第一個子模式匹配(`:controller`)是路徑的控制器部分,第二個是動作,依此類推。
這些占位符有助于編寫對開發人員更具可讀性且更易于理解的正則表達式。支持以下占位符:
| 占位符 | 正則表達式 | 用法 |
| -------------- | ------------------------ | ------------------------------------------------------------------------------------------------------ |
| `/:module` | `/([a-zA-Z0-9\_\-]+)` | 僅使用字母數字字符匹配有效的模塊名稱 |
| `/:controller` | `/([a-zA-Z0-9\_\-]+)` | 僅使用字母數字字符匹配有效的控制器名稱 |
| `/:action` | `/([a-zA-Z0-9_-]+)` | 僅使用字母數字字符匹配有效的操作名稱 |
| `/:params` | `(/.*)*` | 匹配由斜杠分隔的可選單詞列表。僅在路由末尾使用此占位符 |
| `/:namespace` | `/([a-zA-Z0-9\_\-]+)` | 匹配單級命名空間名稱 |
| `/:int` | `/([0-9]+)` | 匹配整數參數 |
控制器名稱是駝峰,這意味著刪除了字符( `-` )和(`_`),下一個字符是大寫的。例如,some_controller被轉換為SomeController。
Since you can add many routes as you need using the `add()` method, the order in which routes are added indicate their relevance, latest routes added have more relevance than first added. Internally, all defined routes are traversed in reverse order until `Phalcon\Mvc\Router` finds the one that matches the given URI and processes it, while ignoring the rest.
由于您可以使用 `add()` 方法根據需要添加許多路由,因此添加路由的順序表明它們的相關性,添加的最新路由具有比首次添加的更多相關性。在內部,所有定義的路由都以相反的順序遍歷,直到`Phalcon\Mvc\Router` 找到與給定URI匹配并處理它的那個,同時忽略其余的路由。
### 帶名稱的參數
下面的示例演示了如何定義路由參數的名稱:
```php
<?php
$router->add(
'/news/([0-9]{4})/([0-9]{2})/([0-9]{2})/:params',
[
'controller' => 'posts',
'action' => 'show',
'year' => 1, // ([0-9]{4})
'month' => 2, // ([0-9]{2})
'day' => 3, // ([0-9]{2})
'params' => 4, // :params
]
);
```
在上面的示例中,路徑未定義`controller`或`action`部件。這些部件將替換為固定值(`posts`和`show`)。用戶將不知道請求真正分發的控制器。在控制器內部,可以按如下方式訪問這些命名參數:
```php
<?php
use Phalcon\Mvc\Controller;
class PostsController extends Controller
{
public function indexAction()
{
}
public function showAction()
{
// Get 'year' parameter
$year = $this->dispatcher->getParam('year');
// Get 'month' parameter
$month = $this->dispatcher->getParam('month');
// Get 'day' parameter
$day = $this->dispatcher->getParam('day');
// ...
}
}
```
請注意,參數的值是從調度程序獲得的。發生這種情況是因為它是最終與應用程序驅動程序交互的組件。此外,還有另一種方法可以創建命名參數作為模式的一部分:
```php
<?php
$router->add(
'/documentation/{chapter}/{name}.{type:[a-z]+}',
[
'controller' => 'documentation',
'action' => 'show',
]
);
```
您可以像以前一樣訪問其值:
```php
<?php
use Phalcon\Mvc\Controller;
class DocumentationController extends Controller
{
public function showAction()
{
// Get 'name' parameter
$name = $this->dispatcher->getParam('name');
// Get 'type' parameter
$type = $this->dispatcher->getParam('type');
// ...
}
}
```
### 短語法
如果您不喜歡使用數組來定義路徑路徑,則還可以使用替代語法。以下示例產生相同的結果:
```php
<?php
// Short form
$router->add(
'/posts/{year:[0-9]+}/{title:[a-z\-]+}',
'Posts::show'
);
// Array form
$router->add(
'/posts/([0-9]+)/([a-z\-]+)',
[
'controller' => 'posts',
'action' => 'show',
'year' => 1,
'title' => 2,
]
);
```
### 混合數組和短語法
可以混合使用數組和短語法來定義路由,在這種情況下請注意,命名參數會根據定義它們的位置自動添加到路徑路徑中:
```php
<?php
// First position must be skipped because it is used for
// the named parameter 'country'
$router->add(
'/news/{country:[a-z]{2}}/([a-z+])/([a-z\-+])',
[
'section' => 2, // Positions start with 2
'article' => 3,
]
);
```
### 模塊路由
您可以定義路徑包含模塊的路由。這特別適用于多模塊應用。可以定義包含模塊通配符的默認路由:
```php
<?php
use Phalcon\Mvc\Router;
$router = new Router(false);
$router->add(
'/:module/:controller/:action/:params',
[
'module' => 1,
'controller' => 2,
'action' => 3,
'params' => 4,
]
);
```
在這種情況下,路由始終必須將模塊名稱作為URL的一部分。例如,以下URL:`/admin/users/edit/sonny` 將被處理為:
| Module | Controller | Action | Parameter |
|:------:|:----------:|:------:|:---------:|
| admin | users | edit | sonny |
或者您可以將特定路由綁定到特定模塊:
```php
<?php
$router->add(
'/login',
[
'module' => 'backend',
'controller' => 'login',
'action' => 'index',
]
);
$router->add(
'/products/:action',
[
'module' => 'frontend',
'controller' => 'products',
'action' => 1,
]
);
```
或者將它們綁定到特定的名稱空間:
```php
<?php
$router->add(
'/:namespace/login',
[
'namespace' => 1,
'controller' => 'login',
'action' => 'index',
]
);
```
命名空間/類名必須分開傳遞:
```php
<?php
$router->add(
'/login',
[
'namespace' => 'Backend\Controllers',
'controller' => 'login',
'action' => 'index',
]
);
```
### HTTP方法限制
使用簡單的`add()`添加路由時,將為任何HTTP方法啟用路由。有時我們可以將路由限制為特定方法,這在創建RESTful應用程序時特別有用:
```php
<?php
// This route only will be matched if the HTTP method is GET
$router->addGet(
'/products/edit/{id}',
'Products::edit'
);
// This route only will be matched if the HTTP method is POST
$router->addPost(
'/products/save',
'Products::save'
);
// This route will be matched if the HTTP method is POST or PUT
$router->add(
'/products/update',
'Products::update'
)->via(
[
'POST',
'PUT',
]
);
```
### 使用轉換器
轉換器允許您在將路由參數傳遞給調度程序之前自由轉換路徑的參數。以下示例顯示了如何使用它們:
```php
<?php
// The action name allows dashes, an action can be: /products/new-ipod-nano-4-generation
$route = $router->add(
'/products/{slug:[a-z\-]+}',
[
'controller' => 'products',
'action' => 'show',
]
);
$route->convert(
'slug',
function ($slug) {
// Transform the slug removing the dashes
return str_replace('-', '', $slug);
}
);
```
轉換器的另一個用例是將模型綁定到路由中。這允許模型直接傳遞到定義的操作:
```php
<?php
// This example works off the assumption that the ID is being used as parameter in the url: /products/4
$route = $router->add(
'/products/{id}',
[
'controller' => 'products',
'action' => 'show',
]
);
$route->convert(
'id',
function ($id) {
// Fetch the model
return Product::findFirstById($id);
}
);
```
### 路由分組
如果一組路由具有公共路徑,則可以對它們進行分組以輕松維護它們:
```php
<?php
use Phalcon\Mvc\Router;
use Phalcon\Mvc\Router\Group as RouterGroup;
$router = new Router();
// Create a group with a common module and controller
$blog = new RouterGroup(
[
'module' => 'blog',
'controller' => 'index',
]
);
// All the routes start with /blog
$blog->setPrefix('/blog');
// Add a route to the group
$blog->add(
'/save',
[
'action' => 'save',
]
);
// Add another route to the group
$blog->add(
'/edit/{id}',
[
'action' => 'edit',
]
);
// This route maps to a controller different than the default
$blog->add(
'/blog',
[
'controller' => 'blog',
'action' => 'index',
]
);
// Add the group to the router
$router->mount($blog);
```
您可以將路徑組移動到單獨的文件,以改善應用程序中的組織和代碼重用:
```php
<?php
use Phalcon\Mvc\Router\Group as RouterGroup;
class BlogRoutes extends RouterGroup
{
public function initialize()
{
// Default paths
$this->setPaths(
[
'module' => 'blog',
'namespace' => 'Blog\Controllers',
]
);
// All the routes start with /blog
$this->setPrefix('/blog');
// Add a route to the group
$this->add(
'/save',
[
'action' => 'save',
]
);
// Add another route to the group
$this->add(
'/edit/{id}',
[
'action' => 'edit',
]
);
// This route maps to a controller different than the default
$this->add(
'/blog',
[
'controller' => 'blog',
'action' => 'index',
]
);
}
}
```
然后將該組安裝在路由器中:
```php
<?php
// Add the group to the router
$router->mount(
new BlogRoutes()
);
```
## 匹配路由
必須將有效的URI傳遞給路由器,以便它可以處理它并找到匹配的路由。默認情況下,路由URI取自重寫引擎模塊創建的`$_GET['_url']`變量。與Phalcon一起使用的幾個重寫規則是:
```apacheconfig
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^((?s).*)$ index.php?_url=/$1 [QSA,L]
```
在此配置中,對不存在的文件或文件夾的任何請求都將發送到`index.php`。以下示例顯示如何在獨立模式下使用此組件:
```php
<?php
use Phalcon\Mvc\Router;
// Creating a router
$router = new Router();
// Define routes here if any
// ...
// Taking URI from $_GET['_url']
$router->handle();
// Or Setting the URI value directly
$router->handle('/employees/edit/17');
// Getting the processed controller
echo $router->getControllerName();
// Getting the processed action
echo $router->getActionName();
// Get the matched route
$route = $router->getMatchedRoute();
```
## 路由命名
添加到路由器的每條路由都在內部存儲為`Phalcon\Mvc\Router\Route` 對象。該類封裝了每個路由的所有細節。例如,我們可以為路徑命名,以便在我們的應用程序中唯一地標識它。如果要從中創建URL,這尤其有用。
```php
<?php
$route = $router->add(
'/posts/{year}/{title}',
'Posts::show'
);
$route->setName('show-posts');
```
然后,使用例如組件`Phalcon\Mvc\Url`,我們可以從其名稱構建路由:
```php
<?php
// Returns /posts/2012/phalcon-1-0-released
echo $url->get(
[
'for' => 'show-posts',
'year' => '2012',
'title' => 'phalcon-1-0-released',
]
);
```
## 用例
以下是自定義路由的示例:
```php
<?php
// Matches '/system/admin/a/edit/7001'
$router->add(
'/system/:controller/a/:action/:params',
[
'controller' => 1,
'action' => 2,
'params' => 3,
]
);
// Matches '/es/news'
$router->add(
'/([a-z]{2})/:controller',
[
'controller' => 2,
'action' => 'index',
'language' => 1,
]
);
// Matches '/es/news'
$router->add(
'/{language:[a-z]{2}}/:controller',
[
'controller' => 2,
'action' => 'index',
]
);
// Matches '/admin/posts/edit/100'
$router->add(
'/admin/:controller/:action/:int',
[
'controller' => 1,
'action' => 2,
'id' => 3,
]
);
// Matches '/posts/2015/02/some-cool-content'
$router->add(
'/posts/([0-9]{4})/([0-9]{2})/([a-z\-]+)',
[
'controller' => 'posts',
'action' => 'show',
'year' => 1,
'month' => 2,
'title' => 3,
]
);
// Matches '/manual/en/translate.adapter.html'
$router->add(
'/manual/([a-z]{2})/([a-z\.]+)\.html',
[
'controller' => 'manual',
'action' => 'show',
'language' => 1,
'file' => 2,
]
);
// Matches /feed/fr/le-robots-hot-news.atom
$router->add(
'/feed/{lang:[a-z]+}/{blog:[a-z\-]+}\.{type:[a-z\-]+}',
'Feed::get'
);
// Matches /api/v1/users/peter.json
$router->add(
'/api/(v1|v2)/{method:[a-z]+}/{param:[a-z]+}\.(json|xml)',
[
'controller' => 'api',
'version' => 1,
'format' => 4,
]
);
```
>[warning] 注意控制器和命名空間的正則表達式中允許的字符。由于它們成為類名,反過來它們通過文件系統可被攻擊者用來讀取未經授權的文件。一個安全的正則表達式是:`/([a-zA-Z0-9\_\-]+)`
## 默認行為
`Phalcon\Mvc\Router`有一個默認行為,它提供了一個非常簡單的路由,總是需要一個匹配以下模式的URI:`/:controller/:action/:params`
例如,對于像`http://phalconphp.com/documentation/show/about.html`這樣的URL,此路由器將按如下方式對其進行翻譯:
| Controller | Action | Parameter |
|:-------------:|:------:|:----------:|
| documentation | show | about.html |
如果您不希望路由器出現此行為,則必須創建路由器,并將`false`作為第一個參數:
```php
<?php
use Phalcon\Mvc\Router;
// Create the router without default routes
$router = new Router(false);
```
## 設置默認路由
當您的應用程序在沒有任何路由的情況下被訪問時,'/'路由用于確定必須使用哪些路徑來顯示您的網站/應用程序中的初始頁面:
```php
<?php
$router->add(
'/',
[
'controller' => 'index',
'action' => 'index',
]
);
```
## Not Found路徑
如果路由器中指定的路由均未匹配,則可以定義要在此方案中使用的一組路徑:
```php
<?php
// Set 404 paths
$router->notFound(
[
'controller' => 'index',
'action' => 'route404',
]
);
```
這通常用于錯誤404頁面。
> 只有在沒有默認路由的情況下創建路由器時,這才有效: `$router = Phalcon\Mvc\Router(FALSE);`
## 設置默認路徑
可以為模塊,控制器或操作定義默認值。當路由缺少任何這些路徑時,它們可以由路由器自動填充:
```php
<?php
// Setting a specific default
$router->setDefaultModule('backend');
$router->setDefaultNamespace('Backend\Controllers');
$router->setDefaultController('index');
$router->setDefaultAction('index');
// Using an array
$router->setDefaults(
[
'controller' => 'index',
'action' => 'index',
]
);
```
## 處理額外/尾隨斜杠
有時可以使用額外/尾部斜杠訪問路徑。這些額外的斜杠將導致在調度器中產生未找到的狀態。您可以設置路由器以自動從處理路徑的末尾刪除斜杠:
```php
<?php
use Phalcon\Mvc\Router;
$router = new Router();
// Remove trailing slashes automatically
$router->removeExtraSlashes(true);
```
或者,您可以修改特定路由以選擇性地接受尾部斜杠:
```php
<?php
// The [/]{0,1} allows this route to have optionally have a trailing slash
$router->add(
'/{language:[a-z]{2}}/:controller[/]{0,1}',
[
'controller' => 2,
'action' => 'index',
]
);
```
## 匹配回調
有時,路由只有在滿足特定條件時才能匹配。您可以使用`beforeMatch()` 回調向路由添加任意條件。如果此函數返回`false`,則路由將被視為不匹配:
```php
<?php
$route = $router->add('/login',
[
'module' => 'admin',
'controller' => 'session',
]
);
$route->beforeMatch(
function ($uri, $route) {
// Check if the request was made with Ajax
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest') {
return false;
}
return true;
}
);
```
您可以在類中重復使用這些額外條件:
```php
<?php
class AjaxFilter
{
public function check()
{
return $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
}
}
```
并使用此類而不是匿名函數:
```php
<?php
$route = $router->add(
'/get/info/{id}',
[
'controller' => 'products',
'action' => 'info',
]
);
$route->beforeMatch(
[
new AjaxFilter(),
'check'
]
);
```
從Phalcon 3開始,還有另一種方法可以檢查:
```php
<?php
$route = $router->add(
'/login',
[
'module' => 'admin',
'controller' => 'session',
]
);
$route->beforeMatch(
function ($uri, $route) {
/**
* @var string $uri
* @var \Phalcon\Mvc\Router\Route $route
* @var \Phalcon\DiInterface $this
* @var \Phalcon\Http\Request $request
*/
$request = $this->getShared('request');
// Check if the request was made with Ajax
return $request->isAjax();
}
);
```
## 主機名約束
路由器允許您設置主機名約束,這意味著可以限制特定路由或一組路由僅在路由也滿足主機名約束時匹配:
```php
<?php
$route = $router->add(
'/login',
[
'module' => 'admin',
'controller' => 'session',
'action' => 'login',
]
);
$route->setHostName('admin.company.com');
```
主機名也可以作為正則表達式傳遞:
```php
<?php
$route = $router->add(
'/login',
[
'module' => 'admin',
'controller' => 'session',
'action' => 'login',
]
);
$route->setHostName('([a-z]+).company.com');
```
在路由組中,您可以設置適用于組中每個路由的主機名約束:
```php
<?php
use Phalcon\Mvc\Router\Group as RouterGroup;
// Create a group with a common module and controller
$blog = new RouterGroup(
[
'module' => 'blog',
'controller' => 'posts',
]
);
// Hostname restriction
$blog->setHostName('blog.mycompany.com');
// All the routes start with /blog
$blog->setPrefix('/blog');
// Default route
$blog->add(
'/',
[
'action' => 'index',
]
);
// Add a route to the group
$blog->add(
'/save',
[
'action' => 'save',
]
);
// Add another route to the group
$blog->add(
'/edit/{id}',
[
'action' => 'edit',
]
);
// Add the group to the router
$router->mount($blog);
```
## URI來源
默認情況下,URI信息是從`$_GET['_url']`變量獲得的,這是由Rewrite-Engine傳遞給Phalcon的,如果需要,你也可以使用`$_SERVER['REQUEST_URI']`:
```php
<?php
use Phalcon\Mvc\Router;
// ...
// Use $_GET['_url'] (default)
$router->setUriSource(
Router::URI_SOURCE_GET_URL
);
// Use $_SERVER['REQUEST_URI']
$router->setUriSource(
Router::URI_SOURCE_SERVER_REQUEST_URI
);
```
或者您可以手動將URI傳遞給`handle()`方法:
```php
<?php
$router->handle('/some/route/to/handle');
```
>[danger] 請注意,使用`Router::URI_SOURCE_GET_URL`會自動解碼Uri,因為它基于`$_REQUEST`超全局。但是,目前使用`Router::URI_SOURCE_SERVER_REQUEST_URI`不會自動為您解碼Uri。這將在下一個主版本中發生變化。
## 測試你的路由
由于此組件沒有依賴關系,您可以創建如下所示的文件來測試您的路由:
```php
<?php
use Phalcon\Mvc\Router;
// These routes simulate real URIs
$testRoutes = [
'/',
'/index',
'/index/index',
'/index/test',
'/products',
'/products/index/',
'/products/show/101',
];
$router = new Router();
// Add here your custom routes
// ...
// Testing each route
foreach ($testRoutes as $testRoute) {
// Handle the route
$router->handle($testRoute);
echo 'Testing ', $testRoute, '<br>';
// Check if some route was matched
if ($router->wasMatched()) {
echo 'Controller: ', $router->getControllerName(), '<br>';
echo 'Action: ', $router->getActionName(), '<br>';
} else {
echo "The route wasn't matched by any route<br>";
}
echo '<br>';
}
```
## 事件
與許多其他組件一樣,路由器也有事件。沒有任何事件可以停止操作。以下是可用事件列表
| 事件 | 描述 |
| -------------------------- | ------------------------------------ |
| `router:beforeCheckRoutes` | 在檢查所有加載的路由之前被觸發 |
| `router:beforeCheckRoute` | 在檢查路由之前被觸發 |
| `router:matchedRoute` | 匹配路由時觸發 |
| `router:notMatchedRoute` | 任一路由匹配時觸發 |
| `router:afterCheckRoutes` | 檢查完所有路由后觸發 |
| `router:beforeMount` | 在安裝新路由之前觸發 |
## 注解路由
此組件提供與注解服務集成的變體。使用此策略,您可以直接在控制器中編寫路由,而不是在服務注冊中添加它們:
```php
<?php
use Phalcon\Mvc\Router\Annotations as RouterAnnotations;
$di['router'] = function () {
// Use the annotations router. We're passing false as we don't want the router to add its default patterns
$router = new RouterAnnotations(false);
// Read the annotations from ProductsController if the URI starts with /api/products
$router->addResource('Products', '/api/products');
return $router;
};
```
注解可以通過以下方式定義:
```php
<?php
/**
* @RoutePrefix('/api/products')
*/
class ProductsController
{
/**
* @Get(
* '/'
* )
*/
public function indexAction()
{
}
/**
* @Get(
* '/edit/{id:[0-9]+}',
* name='edit-robot'
* )
*/
public function editAction($id)
{
}
/**
* @Route(
* '/save',
* methods={'POST', 'PUT'},
* name='save-robot'
* )
*/
public function saveAction()
{
}
/**
* @Route(
* '/delete/{id:[0-9]+}',
* methods='DELETE',
* conversors={
* id='MyConversors::checkId'
* }
* )
*/
public function deleteAction($id)
{
}
public function infoAction($id)
{
}
}
```
僅使用標記有效注解的方法作為路由。支持的注解列表:
| 名稱 | 描述 | 用法 |
| ----------- | ------------------------------------------------------------------------------------------------- | -------------------------------------- |
| RoutePrefix | 要添加到每個路由URI的前綴。此注解必須放在類docblock上| `@RoutePrefix('/api/products')` |
| Route | 此注解將方法標記為路由。此注解必須放在方法docblock中 | `@Route('/api/products/show')` |
| Get | 此注解將方法標記為將HTTP方法限制為`GET`的路由 | `@Get('/api/products/search')` |
| Post | 此注解將方法標記為將HTTP方法限制為`POST`的路由 | `@Post('/api/products/save')` |
| Put | 此注解將方法標記為將HTTP方法限制為`PUT`的路由 | `@Put('/api/products/save')` |
| Delete | 此注解將方法標記為將HTTP方法限制為`DELETE`的路由 | `@Delete('/api/products/delete/{id}')` |
| Options | 此注解將方法標記為將HTTP方法限制為`OPTIONS`的路由 | `@Option('/api/products/info')` |
對于添加路由的注解,支持以下參數:
| 名稱 | 描述 | 用法 |
| ---------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------- |
| methods | 定義路由必須滿足的一個或多個HTTP方法 | `@Route('/api/products', methods={'GET', 'POST'})` |
| name | 定義路由的名稱 | `@Route('/api/products', name='get-products')` |
| paths | 傳遞給 `Phalcon\Mvc\Router::add()` | `@Route('/posts/{id}/{slug}', paths={module='backend'})` 的路徑數組 |
| conversors | 要應用于參數的轉換的哈希值 | `@Route('/posts/{id}/{slug}', conversors={id='MyConversor::getId'})` |
如果您在應用程序中使用模塊,最好使用`addModuleResource()`方法:
```php
<?php
use Phalcon\Mvc\Router\Annotations as RouterAnnotations;
$di['router'] = function () {
// Use the annotations router
$router = new RouterAnnotations(false);
// Read the annotations from Backend\Controllers\ProductsController if the URI starts with /api/products
$router->addModuleResource('backend', 'Products', '/api/products');
return $router;
};
```
## 注冊路由器實例
您可以在服務注冊期間使用Phalcon依賴注入器注冊路由器,以使其在控制器內可用。
您需要在引導程序文件中添加以下代碼(例如 `index.php`,如果使用[Phalcon Developer Tools](http://phalconphp.com/en/download/tools),則為`app/config/services.php`。
```php
<?php
/**
* Add routing capabilities
*/
$di->set(
'router',
function () {
require __DIR__ . '/../app/config/routes.php';
return $router;
}
);
```
您需要創建 `app/config/routes.php`并添加路由器初始化代碼,例如:
```php
<?php
use Phalcon\Mvc\Router;
$router = new Router();
$router->add(
'/login',
[
'controller' => 'login',
'action' => 'index',
]
);
$router->add(
'/products/:action',
[
'controller' => 'products',
'action' => 1,
]
);
return $router;
```
## 實現自己的路由器
必須實現 `Phalcon\Mvc\RouterInterface` 接口才能創建自己的路由器,取代Phalcon提供的路由器。
- 常規
- Welcome
- 貢獻
- 生成回溯
- 測試重現
- 單元測試
- 入門
- 安裝
- Web服務器設置
- WAMP
- XAMPP
- 教程
- 基礎教程
- 教程:創建一個簡單的REST API
- 教程:V?kuró
- 提升性能
- 教程:INVO
- 開發環境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 開發工具
- Phalcon開發者工具的安裝
- Phalcon開發者工具的使用
- 調試應用程序
- 核心
- MVC應用
- 微應用
- 創建命令行(CLI)應用程序
- 依賴注入與服務定位
- MVC架構
- 服務
- 使用緩存提高性能
- 讀取配置
- 上下文轉義
- 類加載器
- 使用命名空間
- 日志
- 隊列
- 數據庫
- 數據庫抽象層
- Phalcon查詢語言(PHQL)
- ODM(對象文檔映射器)
- 使用模型
- 模型行為
- ORM緩存
- 模型事件
- 模型元數據
- 模型關系
- 模型事務
- 驗證模型
- 數據庫遷移
- 分頁
- 前端
- Assets管理
- 閃存消息
- 表單
- 圖像
- 視圖助手(標簽)
- 使用視圖
- Volt:模板引擎
- 業務邏輯
- 訪問控制列表(ACL)
- 注解解析器
- 控制器
- 調度控制器
- 事件管理器
- 過濾與清理
- 路由
- 在session中存儲數據
- 生成URL和路徑
- 驗證
- HTTP
- Cookies管理
- 請求環境
- 返回響應
- 安全
- 加密/解密
- 安全
- 國際化
- 國際化
- 多語言支持