Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 ZF2通过工厂访问路线和立柱_Zend Framework2 - Fatal编程技术网

Zend framework2 ZF2通过工厂访问路线和立柱

Zend framework2 ZF2通过工厂访问路线和立柱,zend-framework2,Zend Framework2,我试图通过一个表单工厂访问一条路线和一个帖子。路由或post包含一个ID,我需要将其注入表单中,以便构建select语句 目前,我正在通过控制器使用 $this->MyForm->get('elementName')->setOptions(array('value_options' =>$myArrayOfOptions)); 我的目标是将业务逻辑排除在控制器之外,因此我热衷于使用formFactory,但我确实需要访问帖子或路线中的ID来实现这一点 我的表单工厂如下

我试图通过一个表单工厂访问一条路线和一个帖子。路由或post包含一个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)
            );
        }
    } 

您可以访问请求实例

MyFormFactory

//...
$request = $serviceLocator->getServiceLocator()->get('Request');

$id = $request->getPost('id', false);

if ($id) $form->setOption('id', $id);

//...
编辑:这与

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

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

半决赛代码::

    $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)
最终代码::

    $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)

以下是控制器工厂的示例,其工作方式与任何其他工厂相同:

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

啊,这是胜利的一半。谢谢你。那么getPost负责post操作,是什么代替了$\u GET['id']操作?您可以访问,这样您就可以执行
$request->getQuery('id')
etcBrilliant,这就是我一直在搜索的内容。非常感谢。注意到getRequest()没有从url:myroute/path/ID/1获取ID,但是getRequestUri()返回“myroute/path/ID/1”。我假设如果没有更好的方法,我将不得不从字符串中去掉ID?除非我的ZF@framework版本需要更新…@HappyCoder,否则请求对象是
$\u GET
$\u POST
等的包装器,因此您不会在那里获得路由参数。您可以通过
Zend\Mvc\Controller\Plugin\Params
Controller插件访问它们,该插件将在控制器内用作
$this->Params()->fromRoute('id')
。该插件只是一个方便的长期插件:
$controller->getEvent()->getRouteMatch()->getParam('id')