在url中使用破折号时路由不起作用


Routing not working when using dash in the url

我的应用程序中有以下两条路线:

Router::connect('/posts/:id',
                    array('controller' => 'posts', 'action' => 'view'),
                    array('id' => '[A-Za-z0-9'._-]+', 'pass' => array('id')));
    Router::connect('/posts/:slug-:id',
                    array('controller' => 'posts', 'action' => 'view'),
                    array(
                        'id'   => '[A-Za-z0-9'._-]+',
                        'slug' => '[A-Za-z0-9'._-]+',
                        'pass' => array('id', 'slug')
                    ));

一个示例url是:

/posts/This_is_the_first_post-1

然而,它会显示404,但如果我将id之前的url -更改为/,它会起作用:/你知道问题是什么吗?是正则表达式导致的吗??

以下是我的视图方法:

function view ( $id = null, $slug = null )
    {
        $post = $this->Post->find('first',array('contain'=>array('User'=>'Profile'),'conditions'=>array('Post.id'=>$id)));
        if (!$post)
        {
            throw new NotFoundException('404');
        }
        else if($post['Post']['status'] == '0') // 0=draft 1=closed 2=open
        {
            if($post['Post']['user_id'] == $this->Auth->user('id'))
            {
                $this->Session->setFlash('Your post has NOT been published yet');
            }
            else
            {
                throw new NotFoundException('404');
            }
        }
        if (Inflector::slug($post['Post']['title']) != $slug || $slug = null)
        {
            $this->redirect(array('id'=>$post['Post']['id'],'slug'=>Inflector::slug($post['Post']['title'])));
        }
        $this->set(compact('post'));
    }

它看起来是由正则表达式引起的。在第一条路由中,您允许-,因此它可能无法与第二条路由区分开来,在第二条路径中,:id应该遵循-

Router::connect('/posts/:id',
                array('controller' => 'posts', 'action' => 'view'),
                array('id' => '[A-Za-z0-9'._]+', 'pass' => array('id')));
                //---Removed hyphen-----^^^^^^
Router::connect('/posts/:slug-:id',
                array('controller' => 'posts', 'action' => 'view'),
                array(
                    'id'   => '[A-Za-z0-9'._]+',
                //---Removed hyphen-----^^^^^^
                    'slug' => '[A-Za-z0-9'._]+',
                //---Removed hyphen-----^^^^^^
                    'pass' => array('id', 'slug')
                ));