【问题标题】:Route not working when parameter passed to default action将参数传递给默认操作时路由不起作用
【发布时间】:2019-02-18 10:53:38
【问题描述】:

我有以下路线设置。

$router->add('/schools', array(
    'module' => 'schools',
    'namespace'=>'MyNameSpace\Schools\Controllers\\',
    'controller'=>'index',
    'action' => 'index'
));

$router->add('/schools/:params",array(
    'module' => 'schools',
    'namespace'=>'MyNameSpace\Schools\Controllers\\',
    'controller'=>'index',
    'action' => 'index',
    'params' => 1
));

问题:

1.  http://www.example.com/schools/23 

工作正常

2.  http://www.example.com/schools/~23

同样有效

但是,

3.  http://www.example.com/schools/school-name

不工作, 其中上述URL中的school-name~2323是控制器默认动作(index)的参数。

我无法在控制器的initialize 方法中打印任何内容。尝试将 try catch 也放在 index.phpmain 方法上,没有错误。

执行上面的第三个 URL 时,我无法打印任何内容,我只是在浏览器上打印了 1,没有其他错误。 然后,我在http://www.example.com/schools/~23 中打印了匹配的路由路径,它给出了

Phalcon\Mvc\Router\Route Object
(
    [_pattern:protected] => /schools/:params
    [_compiledPattern:protected] => #^/schools(/.*)*$#
    [_paths:protected] => Array
        (
            [module] => schools
            [namespace] => MyNameSpace\Schools\Controllers\
            [controller] => index
            [action] => index
            [params] => 1
        )

    [_methods:protected] => 
    [_hostname:protected] => 
    [_converters:protected] => 
    [_id:protected] => 34
    [_name:protected] => 
    [_beforeMatch:protected] => 
    [_group:protected] => 
)

按照路线,对象打印在http://www.example.com/schools/23

Phalcon\Mvc\Router\Route Object
(
    [_pattern:protected] => /schools/:action/:params
    [_compiledPattern:protected] => #^/schools/([a-zA-Z0-9\_\-]+)(/.*)*$#
    [_paths:protected] => Array
        (
            [module] => schools
            [namespace] => MyNameSpace\Schools\Controllers\
            [controller] => index
            [action] => 1
            [params] => 2
        )

    [_methods:protected] => 
    [_hostname:protected] => 
    [_converters:protected] => 
    [_id:protected] => 36
    [_name:protected] => 
    [_beforeMatch:protected] => 
    [_group:protected] => 
)

更新 令人惊讶的是,以下网址也可以使用

http://www.example.com/schools/~school-name 但不是http://www.example.com/schools/school-name

Phalcon\Mvc\Router\Route Object
(
    [_pattern:protected] => /schools/:params
    [_compiledPattern:protected] => #^/schools(/.*)*$#
    [_paths:protected] => Array
        (
            [module] => agencies
            [namespace] => MyNameSpace\Schools\Controllers\
            [controller] => index
            [action] => index
            [params] => 1
        )

    [_methods:protected] => 
    [_hostname:protected] => 
    [_converters:protected] => 
    [_id:protected] => 34
    [_name:protected] => 
    [_beforeMatch:protected] => 
    [_group:protected] => 
)

谁能帮助我,我在这里做错了什么? 谢谢

【问题讨论】:

    标签: php phalcon phalcon-routing


    【解决方案1】:

    如果你看到这个[_pattern:protected] => /schools/:action/:params 而你的代码没有这个规则,那么它看起来就像应用了默认路由。

    使用false 创建Router 以禁用默认路由。

    在 Phalcon 代码中明确设置为使用默认值:https://docs.phalconphp.com/3.4/en/api/Phalcon_Mvc_Router

    public function __construct(bool! defaultRoutes = true)

    【讨论】:

    • 我确实在实际代码中定义了/schools/:action/:params 路由。但是为什么 2 个示例规则只是因为参数是数字或有倾斜符号而起作用?如果字母表(我的帖子中的第三个示例)不起作用??
    • http://www.example.com/schools/~school-name 也可以,但不能http://www.example.com/schools/school-name
    • 规则以相反的顺序工作。如果 :action 定义为最后一个并且匹配,那么它将被拾取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多