ZF2通过工厂访问路线和帖子

时间:2014-06-05 10:23:30

标签: zend-framework2

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

目前我正在使用

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

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

My Form Factory看起来像这样:

<?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)
            );
        }
    } 

任何想法?

3 个答案:

答案 0 :(得分:5)

您可以访问请求实例

<强> 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访问路径参数。

$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); //....

答案 1 :(得分: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)

答案 2 :(得分:0)

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

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(...);
    }
}