zf2 AbstractRestfullController API路由

Jac*_*cob 0 php rest zend-framework2

我对zf2很新.我正在尝试为我们的联系人管理系统构建RESTful API.我们正在扩大AbstractRestfulController其使用getList(),get()等行动.

除了一个url路由之外,一切都像我期望的那样工作.当我去这个网址

/contacts
Run Code Online (Sandbox Code Playgroud)

它成功地路由到getList()我的方法ContactsController.但是当我去这里的时候.

/contacts/1253378/stats
Run Code Online (Sandbox Code Playgroud)

它路由到get()我的方法StatsController.我希望url路由到该getList()方法,然后我将返回一个统计列表.

我希望/idnumber在该url的末尾添加一个将路由到get()我的方法StatsController,这将返回一个具有该id的stat.

基本上我试图复制这个REST教程中的But how do you deal with relations内容.

http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#restful

我希望我的module.config.php文件中的路由不正确

'router' => array(
    'routes' => array(

        'contacts' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/contacts[/:id]',
                'constraints' => array(
                    'id'     => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Contacts\Controller\ContactsController',
                ),
            ),
        ),

        'stats' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/contacts/[:id]/stats[/:id]',
                'constraints' => array(
                    'id'     => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Contacts\Controller\StatsController',
                ),
            ),
        ),

    ),
),
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Xer*_*kus 5

在你的情况下问题是id参数冲突,推荐的方法是使用特定的参数名称,例如:

'router' => array(
    'routes' => array(
       'contacts' => array(
            'type'    => 'segment',
            'options' => array(
               'route'    => '/contacts[/:contactId]',
                'constraints' => array(
                    'contactId'     => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Contacts\Controller\ContactsController',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'stats' => array(
                    'type'    => 'segment',
                    'options' => array(
                       'route'    => '/stats[/:statId]',
                       'constraints' => array(
                            'statId'     => '[0-9]+',
                        ),
                        'defaults' => array(
                            'controller' => 'Contacts\Controller\StatsController',
                        ),
                    ),
                ),
            ),
        ),
    ),
),
Run Code Online (Sandbox Code Playgroud)

Url /contacts/1253378/stats将匹配contacts/stats路由contactId设置为1253378

为了使这一变化的工作,你将需要设置保护的财产identifierNameContacts\Controller\ContactsController为"的ContactID",并Contacts\Controller\StatsControllerstatId

现在控制器将正确使用Id的单独变量,一切都应该正常工作.