Phalcon#基本功能#路由

Phalcon\Mvc\Router 提供了高级路由支持,在 MVC 模式下可以自定义路由映射到指定的控制器和动作。Router 只是收集路由信息,最终是通过派遣器 Phalcon\Mvc\Dispatcher 来调用相应控制器和动作。

注册路由 router 和 派遣器 dispatcher

<?php

$di = new Phalcon\Di\FactoryDefault();

//注册路由
$di->set('router', function () {
    $router = Phalcon\Mvc\Router();
    $router->add(
        '/{id:[0-9]+}',
        [
           'controller' => 'index',
           'action' => 'show'
        ]
    );
    return $router;
});

//注册派遣器
$di->set('dispatcher', function () {
    $dispatcher = new Phalcon\Mvc\Dispatcher();
    $dispatcher->setDefaultNamespace('App\Controllers');
    return $dispatcher;
});

默认 URI 信息是从 $ _GET['_url'] 获得,也可以设置为从 $_SERVER['REQUEST_URI'] 获取。
使用 $_GET['_url'] (默认):

use Phalcon\Mvc\Router;
$router->setUriSource(Router::URI_SOURCE_GET_URL);

Nginx 配置:

location / {
    try_files $uri $uri/ /index.php?_url=$uri&$args;
}

使用 $_SERVER['REQUEST_URI']:

use Phalcon\Mvc\Router;
$router->setUriSource(Router::URI_SOURCE_SERVER_REQUEST_URI);

Nginx 配置:

location / {
    try_files $uri $uri/ /index.php;
}
定义单个路由
$router->add(
    '/article/info', 
    [
        'controller' => 'article',
        'action' => 'info'
    ]
);
使用通配符定义多个路由
$router->add(
    'admin/:controller/xxx/:action/:params',
    [
        'controller' => 1,
        'action' => 2,
        'params' => 3
    ]
);

通过上面的通配符定义了一个可以匹配多个 URL 的路由,当访问这个 URL(/admin/news/xxx/show/1/test),则对应的参数如下:
Controller:NewsController
Action:showAction
Parameter:1
Parameter:test

<?php
namespace App\Controllers;
 
use Phalcon\Mvc\Controller;
 
class NewsController extends Controller
{
    public function showAction($id,  $testParam)
    {
         echo $id, '|' , $testParam; // 输出 1|test
    }
}

支持的通配符:

Placeholder Regular Exception Usage
/:module /([a-zA-Z0-9_-]+) 匹配模块
/:controller /([a-zA-Z0-9_-]+) 匹配控制器
/:action /([a-zA-Z0-9_]+) 匹配方法
/:params (/.*)* 匹配参数,可匹配多个参:/param1/param2[...]
/:namespace /([a-zA-Z0-9_-]+) 匹配命名空间
/:int /([0-9]+) 匹配数字参数
参数名称
$router->add(
    '/news/([0-9]{4})/([0-9]{2})/([0-9]{2})/:params',
    [
         'controller' => 'news',
         'action' => 'show',
         'year' => 1,     // ([0-9]{4})
         'month' => 2,    // ([0-9]{2})
         'day' => 3,      // ([0-9]{2})
         'params' => 4    // :params
    ]
);

控制器中获取参数:

<?php
 
namespace App\Controllers;
 
use Phalcon\Mvc\Controller;
 
class NewsController extends Controller
{
     public function showAction()
     {
         // 获取参数year
         $year = $this->dispatcher->getParam('year');
           
         // 获取参数month
         $month = $this->dispatcher->getParam('month');
         // 获取参数day
         $day = $this->dispatcher->getParam('day');
     }
}
短语法

下面两种路由添加方式效果相同:

<?php
 
// 短语法
$router->add('/news/{id:[0-9]+}', 'News::show');
 
// 数组语法
$router->add(
    '/news/([0-9]+)',
    [
         'controller' => 'news',
         'action' => 'show',
         'id' => 1
    ]
);

混合使用数组和短语法:

<?php
 
$router->add(
    '/news/{param1:[a-z]{2}}/([a-z]+)/([a-z\-]+)',
    [
        'param2' => 2,     // 匹配起始位置为2,第一个匹配位已被param1占用
        'param3' => 3
    ]
);
RESTful路由
<?php
 
// 匹配http请求为get方式的路由
$router->addGet('/products/{id}/edit', 'Products::edit');
method path description Controller::action
GET /article 索引、列表 Article::index
GET /article/create 创建 Article::create
POST /article 保存 Article::save
GET /article/{id} 显示 Article::show
GET /article/{id}/edit 编辑 Article::edit
PUT/PATCH /article/{id} 更新 Article::update
DELETE /article/{id} 删除 Article::destroy
路由分组

当我们需要配置相同路径下的多个路由时,就可以使用路由分组的功能。

<?php

use Palcon\Mvc\Router;
use Palcon\Mvc\Router\Group as RouterGroup;

$router = new Router();

// 创建一个分组路由
$blog = new RouerGroup(
     [
         'module' => 'blog',
         'controller' => 'index'
     ]
);

// 设置路由前缀
$blog->setPrefix('/blog');

// 添加路由
$blog->add('/save', ['action' => 'save']);
$blog->add('/edit/{id}', ['action' => 'edit']);
  
// 绑定分组路由
$router->mount($blog);
路由命名

给路由命名:

<?php
 
// 命名路由
$route = $router->add('/posts/{year}/{title}', 'Posts::show')->setName('postsShow');

生成 url 时:

<?php
 
$url = new Phalcon\Mvc\Url;
echo  $url->get([
    'for' => 'postsShow',
    'year' => '2016',
    'title' => 'test'
]);
设置默认路由及 404 页面
<?php
 
$router->add(
    '/',
    [
        'controller' => 'index',
        'action' => 'index'
    ]
);
 
// 设置404路由
$router->notFound(
    'controller' => 'index',
    'action' => 'route404'
);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容