【问题标题】:ZF2 Accessing routes and posts via a factoryZF2 通过工厂访问路线和帖子
【发布时间】:2014-06-05 10:23:30
【问题描述】:

我正在尝试通过表单工厂访问路线和发布。路由或帖子包含一个 ID,我需要将其注入到我的表单中,以便我可以构建一个 select 语句。

目前我正在使用

通过控制器注入表单
$this->MyForm->get('elementName')->setOptions(array('value_options' =>$myArrayOfOptions));

我的目标是将业务逻辑排除在控制器之外,因此我热衷于使用 formFactory,但我确实需要访问帖子或路由中的 ID 来实现这一点。

我的表单工厂如下所示:

<?php
namespace MyModule\Form;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use AdminLottery\InputFilter\MyFilter;
use AdminLottery\Service\MyService;

     class MyFormFactory implements FactoryInterface
     {
        /**
         * Create service
         *
         * @param ServiceLocatorInterface $serviceLocator
         * @return mixed
        */
        public function createService(
            ServiceLocatorInterface $serviceLocator
        )
        {
            //$serviceLocator is FormElementManager
            $realSL = $serviceLocator->getServiceLocator();

            //*** I NEED TO ACCESS THE ID / POST HERE TO SEND TO MY FORM

            return new MyForm(
                $realSL->get('Doctrine\ORM\EntityManager'),
                $realSL->get('InputFilterManager')->get(MyFilter::class),
                $realSL,
                $realSL->get(MyService::class)
            );
        }
    } 

有什么想法吗??

【问题讨论】:

    标签: zend-framework2


    【解决方案1】:

    可以访问请求实例

    MyFormFactory

    //...
    $request = $serviceLocator->getServiceLocator()->get('Request');
    
    $id = $request->getPost('id', false);
    
    if ($id) $form->setOption('id', $id);
    
    //...
    

    编辑:这与another question I answered非常相似

    编辑 2

    在你的工厂可以通过路由器的Zend\Mvc\Router\RouteMatch访问route参数。

    $request = $serviceLocator->getServiceLocator()->get('Request');
    $router  = $serviceLocator->getServiceLocator()->get('Router');
    $match   = $router->match($request); // \Zend\Mvc\Router\RouteMatch
    
    $id = ($match) ? $match->getParam('id', false) : false;  
    
    if ($id) $form->setOption('id', $id); //....
    

    【讨论】:

    • 啊,这是成功的一半。谢谢你。所以 getPost 负责发布操作,$_GET['id'] 操作会发生什么?
    • 你可以访问Zend/Http/Request,所以你可以做$request-&gt;getQuery('id')
    • 太棒了,这就是我一直在寻找的。谢谢!!
    • 注意到 getRequest() 不会从 url 中获取 ID:myroute/path/id/1 但是 getRequestUri() 返回“myroute/path/id/1”。我假设如果没有更好的方法,我将不得不从字符串中删除 ID?除非我的 ZF@ 框架版本需要更新……
    • @HappyCoder 请求对象是$_GET$_POST 等的包装器所以你不会在那里得到路由参数。您可以通过 Zend\Mvc\Controller\Plugin\Params 控制器插件访问它们,该插件将在控制器内用作 $this-&gt;params()-&gt;fromRoute('id')。该插件只是一个更长的便利插件:$controller-&gt;getEvent()-&gt;getRouteMatch()-&gt;getParam('id').
    【解决方案2】:

    对于任何寻求参考的人,我想我会添加我使用的最终代码:

    半决赛代码::

        $router = $realSL->get('Router');
        $request = $realSL->get('Request');
        $routeMatch = $router->match($request);
        $matchArray  = $routeMatch->getParams();
        if (isset($matchArray['id'])) {
            $id = (int) $matchArray['id'];
        }  else {
            $id = 0;
        }
    

    最终代码::

    $realSL->get('application')->getMvcEvent()->getRouteMatch()->getParam('id', 0)
    

    【讨论】:

      【解决方案3】:

      这是一个控制器工厂的示例,它可以以相同的方式用于任何其他工厂:

      namespace MyModule\Controller\Factory;
      
      use MyModule\Controller\MyController;
      use Zend\ServiceManager\FactoryInterface;
      use Zend\ServiceManager\ServiceLocatorInterface;
      
      class MyControllerFactory implements FactoryInterface
      {
      
          public function createService(ServiceLocatorInterface $serviceLocator)
          {
              /*
               * @var Zend\ServiceManager\ServiceManager
               */
              $realServiceLocator = $serviceLocator->getServiceLocator();
              ...
              $router = $realServiceLocator->get('router');
              $request = $realServiceLocator->get('request');
              $routerMatch = $router->match($request);
              ...
              $test1 = $routerMatch->getParams();
              $test2 = $request->getQuery();
              $test3 = $request->getPost();
              ...
              return new MyController(...);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-26
        • 1970-01-01
        • 2015-05-22
        • 2011-01-15
        相关资源
        最近更新 更多