我正在尝试访问路线并通过表格工厂发布。路线或帖子包含我需要注入表单的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)
);
}
}
任何想法?
答案 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(...);
}
}