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