1

我正在尝试路由到我的控制器的编辑操作,但我没有成功。下面是我的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

4 回答 4

1

假设您是新手,如果您正在为某些 CRUD 应用程序,您需要知道的事情很少,我建议您必须按照 ZF2 Skeleton 应用程序或专辑应用程序中的指导创建一个新模块,您提供的设置是正确的并没有错。

假设您已经创建了一个新模块并且您正在开发新模块,并且您的所有路由都已正确定义您必须做的是将模块的名称包含到 application.config.php 文件中,该文件位于 config 文件夹下,如果您已经创建了一个 bew 模块,然后在这个部分添加它的名字

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

      ),

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

于 2013-08-25T21:15:02.960 回答
0

动作可以在你的控制器中使用 [/:action] 作为路由的一部分进行路由。这将映射到控制器中匹配相同名称的函数,例如,在您的示例中,../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”文件

于 2013-08-26T00:33:52.557 回答
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', ), ), );

于 2013-08-26T20:46:10.193 回答
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都是 type Literal。这意味着这些网址永远不会附加任何参数。他们总是可以拥有QueryParameters,但RouteParameters不会对它们起作用。

然后你得到你的edit-Route。这个现在是 type Segment,这意味着有一个部分,一个段,是可变的。此外,路由前面是/edit,所以完整的 url 现在至少变成/manager/edit了可选的 id /manager/edit[/1234]。ID 是否可选由您决定。如果您不希望它是可选的,只需删除它周围的括号并像这样创建路由定义:'route' => '/edit/:id'虽然我个人喜欢在没有附加 ID 的情况下使用“编辑索引”。

于 2013-08-26T05:52:59.797 回答