如何调用zf2中的动态操作视图

时间:2015-04-01 12:05:27

标签: zend-framework2

朋友您好我是zf2的新手。我卡在一个地方。在我的项目中,我想在很多动作上调用一个视图。 我的网址是“baseurl / g / any-thing-from-from-database” 我想从另一个模块或同一个模块中调用“来自数据库的任何东西”的视图。

我的G模块在module.config.php

上有这个代码
 return array(
 'controllers' => array(
     'invokables' => array(
         'G\Controller\G' => 'G\Controller\GController',
     ),
 ),


 'router' => array(
     'routes' => array(
         'g' => array(
             'type'    => 'segment',
             'options' => array(
                 'route'    => '/g[/:action][/:id]',
                 'constraints' => array(
                     'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                     'id'     => '[0-9]+',
                 ),
                 'defaults' => array(
                     'controller' => 'G\Controller\G',
                     'action'     => 'g',
                 ),
             ),
         ),
     ),
 ),

 'view_manager' => array(

     'template_path_stack' => array(
         'g' => __DIR__ . '/../view',
     ),
 ),
 );

在GController.php上

         namespace G\Controller;

     use Zend\Mvc\Controller\AbstractActionController;
     use Zend\View\Model\ViewModel;
     use Zend\Stdlib\RequestInterface as Request;
     use Zend\Stdlib\ResponseInterface as Response;
     use Zend\View\Renderer\PhpRenderer;
     use Students\Form\StudentsForm;
     use Students\Model\Students;


     class GController extends AbstractActionController
            {
                public function dispatch(Request $request, Response $response = null)
                        {
                            $controller = $this->params('controller');
                             $nicname = $this->params('action');
                             if($nicname !== false){

                                 $hosts = $this->getServiceLocator()->get('Manager\Model\HostsTable');

                                 if(($data = $hosts->findByNicname($nicname)) !== null){


                                    $captchaService = $this->getServiceLocator()->get('SanCaptcha');

                                    $form = new StudentsForm($captchaService);

                                     return array('from'=>$form);
                                 } 
                             }

                                return $this->redirect()->toRoute('home',array('controller'=>'application','action'=>'index')); 
                        }


                    public function gAction()
                    {
                        return new ViewModel();
                    }

            }

要从url获取不同的操作,我使用了正常工作的调度功能。当我从数据库中获取此操作时,我想显示一个表单,其中包含来自名为Students或G的不同模块的一些内容。但此代码仅显示页眉和页脚,没有任何其他没有任何错误。请帮助我。谢谢提前。

1 个答案:

答案 0 :(得分:0)

我认为覆盖调度方法不是很好。

我确定你没有看到任何东西,因为你没有渲染ViewModel,因此没有数据存在。这是因为您禁用了默认的调度行为并覆盖了路径中的action参数。因此,如果您打开 http://my.website/g/foobar ,那么将调用foobarAction() - 如果您的调度将正常工作。

所以你可以做的就是简单地将你的动作参数重命名为(例如)foo,将你的逻辑带到gAction()并做你用 $ this-> param('foo')所做的事情。 )