我一直收到这个错误。路由无法匹配请求的URL

时间:2013-08-25 21:00:01

标签: routes zend-framework2

我正在尝试转到我的控制器的编辑操作,但我没有成功。以下是我的 module.config.php 文件的内容。我正在使用Zend框架2.我是否需要在控制器中路由每个动作?

<?php
 return array(
'controllers' => array(
    'invokables' => array(
        'Manager\Controller\Index' => 'Manager\Controller\IndexController',
    ),
),
'router' => array(
    'routes' => array(
        'manager' => array(
            'type'    => 'Literal',
            'options' => array(
                // Change this to something specific to your module
                'route'    => '/manager',
                'defaults' => array(
                    // Change this value to reflect the namespace in which
                    // the controllers for your module are found
                    '__NAMESPACE__' => 'Manager\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                // This route is a sane default when developing a module;
                // as you solidify the routes for your module, however,
                // you may want to remove it and replace it with more
                // specific routes.
                'default' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '/[:controller[/:action]]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                        ),
                    ),
                ),
            ),
        ),

    ),
),
'view_manager' => array(
    'template_path_stack' => array(
        'Manager' => __DIR__ . '/../view',
    ),
),

);

4 个答案:

答案 0 :(得分:1)

假设您是新手,如果您正在处理某些CRUD的应用程序,则需要了解一些事项,我建议您必须按照ZF2 Skeleton应用程序或相册应用程序中的指导创建新模块,设置为您提供的是正确的,没有任何错误。

让我们假设您已经创建了一个新模块并且您正在处理新模块,并且您正确定义了所有路由,您必须要做的是将Module的名称包含到application.config.php文件中,此文件位于config文件夹下,如果您已经创建了一个bew模块,那么在本节中添加其名称

     'modules' => array(
    'ZendDeveloperTools',
    'DoctrineModule',
    'DoctrineORMModule',
    'Application,
     'newlyCreatedModule'

      ),

上面是我的1个文件的snipppet的一部分所以不要与它混淆。如需更多参考,请尝试关注ZF2的相册申请。 此外,您不需要在我们必须为每个模块提供的module.config.php文件中的ZF2处理的任何控制器中编写路由。

答案 1 :(得分:0)

可以使用[/:action]作为路径的一部分在您的控制器中路由操作。这将被映射到Controller中匹配相同名称的函数,例如在您的示例中../manager/foo将映射到fooAction函数,.. manager / index将映射到indexAction函数等

通常(至少在我看过的例子中)要编辑的记录的ID作为url中的参数传递。例如。 example.com/manager/edit/1

如果这是你想要达到的目的,你就错过了路线“[/:id]”中的一块(见下面的代码)

将此作为路由器的简化版本(module.config.php)

<?php
namespace Manager;
return array(
'controllers' => array(
    'invokables' => array(
        'Manager\Controller\Index' => 'Manager\Controller\IndexController',
    ),
),
'router' => array(
    'routes' => array(
        'manager' => array(
            'type' => 'segment',
            'options' => array(
                'route' => '/manager[/:action][/:id]',
                'constraints' => array(
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'id' => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Manager\Controller\Index',
                    'action' => 'index',
                ),
            ),
        ),

    ),
),
'view_manager' => array(
'template_path_stack' => array(
    'Manager' => __DIR__ . '/../view',
    ),
  ),

);

还要确保在IndexController类“IndexController.php”中有一个编辑功能,例如

public function editAction()
{

//Some code to edit the record....

}

以及视图目录中的“edit.phtml”文件

答案 2 :(得分:0)

您设置路线的方式如下:

/manager[/:controller[/:action]]

这意味着,您要查找的网址可能是:

/manager/manager/edit

您需要了解儿童路线仅仅是当前路线定义的附录。那么你可以做的就是@Finbarr建议的,或者你选择嵌套路线,它们会更快一点,看起来像这样:

'manager' => array(
    'type'    => 'Zend\Mvc\Http\Literal',
    'options' => array(
        'route'    => '/manager',
        'defaults' => array(
            'controller' => 'Manager\Controller\Index',
            'action'     => 'index'
        )
    ),
    'may_terminate' => true,
    'child_routes'  => array(
        'add' => array(
            'type'    => 'Zend\Mvc\Http\Literal',
            'options' => array(
                'route' => '/add'
            ),
            'defaults' => array(
                'action' => 'add',
            ),
        ),
        'edit' => array(
            'type'    => 'Zend\Mvc\Http\Segment',
            'options' => array(
                'route'    => '/edit[/:id]',
                'defaults' => array(
                    'action' => 'edit',
                ),
                'constraints' => array(
                    'id' => '\d+',
                ),
            )
        ),
    )
)

注意所做的不同。路由manageradd都是Literal类型。这意味着那些网址从未附加任何参数。他们总是可以QueryParameters,但RouteParameters不会对他们有效。

然后你得到你的edit - 路线。现在这个类型为Segment,意味着有一个部分,一个段,是可变的。此外,该路线由/edit作为前缀,因此现在,完整网址至少为/manager/edit,并带有可选的ID /manager/edit[/1234]。是否可以选择ID。如果您不希望它是可选的,只需删除它周围的括号并创建如下的路径定义:'route' => '/edit/:id',但我个人喜欢在没有附加ID的情况下使用'edit-index'。

答案 3 :(得分:0)

谢谢你们,我终于得到了它的工作。我在module.config.php中的代码与Finbarr的答案中的代码完全相同。这是再次。




namespace Manager; return array( 'controllers' => array( 'invokables' => array( 'Manager\Controller\Manager' => 'Manager\Controller\ManagerController', ), ), 'router' => array( 'routes' => array( 'manager' => array( 'type' => 'segment', 'options' => array( 'route' => '/manager[/:action][/:id]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Manager\Controller\Manager', 'action' => 'index', ), ), ), ), ), 'view_manager' => array( 'template_path_stack' => array( 'manager' => DIR . '/../view', ), ), );