Zend framework2 向路由添加参数的事件

Zend framework2 向路由添加参数的事件,zend-framework2,Zend Framework2,是否可以连接(理想情况下在控制器中)以向路由添加附加参数 我知道这听起来不清楚,乍一看可能听起来很可笑——因为要到达控制器,我们必须有路由。但我只想更改默认变量 我将尝试解释我想要实现的目标: 配置: return [ 'router' => [ 'routes' => [ 'some' => [ 'type' => 'Zend\Mvc\Router\Http\Segment',

是否可以连接(理想情况下在控制器中)以向路由添加附加参数

我知道这听起来不清楚,乍一看可能听起来很可笑——因为要到达控制器,我们必须有路由。但我只想更改默认变量

我将尝试解释我想要实现的目标:

配置:

return [
    'router' => [
        'routes' => [
            'some' => [
                'type'    => 'Zend\Mvc\Router\Http\Segment',
                'options' => [
                    'route'    => '/some/:project',
                    'defaults' => [
                        '__NAMESPACE__' => 'Some\Controller',
                        'controller'    => 'Some\Controller\Some',
                        'action'        => 'some',
                        'extra'         => 'default-value'
                    ],
                ],
            ]
        ]
    ]
];
控制器:

class SomeController extends AbstractActionController {

    protected $project = null;

    public function setEventManager(EventManagerInterface $events)
    {
        parent::setEventManager($events);
        $controller = $this;
        $events->attach(
            'dispatch', function (\Zend\Mvc\MvcEvent $e) use ($controller) {
                $params = $e->getRouteMatch()->getParams();
                    $this->project = $params['project'] ;

                    // and there should be something that I want to 
                    // achieve but do not know how (and if it is possible)

                    if ($this->project == 1) {

                          // magic action which modify config default param 
                          // "extra"  from "default-value" to "changed-value" 

                    }


                    return;

            }, 50
        ); 
    }

   protected function attachDefaultListeners()
   {
       parent::attachDefaultListeners();
       $eventManager = $this->getEventManager();
       $eventManager->attach(
          \Zend\Mvc\MvcEvent::EVENT_DISPATCH,
          function(\Zend\Mvc\MvcEvent $event) {
            $ViewModel = $event->getResult();
            if ($ViewModel instanceof \Zend\View\Model\ViewModel) {
                $ViewModel->setVariable('project',$this->project);
            }
        },
        -99);
    }


    public function someAction() {

       echo $this->params()->fromRoute("extra"); // return "default-value";

       // but i want 

       echo $this->params()->fromRoute("extra"); // return "changed-value";

       return new ViewModel();
    } 

}
看法


是否确实要更改默认值参数

if ($this->project == 1) {
    $e->getRouteMatch()->setParam('extra', 'changed-value');
}
可以全局设置装配的默认参数:

$serviceLocator->get('router')->setDefaultParam('extra', 'changed-value');
无法更改Zend\Mvc\Router\Http\Segment的默认属性


如果您真的需要它,您必须扩展这个类(但我不建议这样做,因为我认为您的方法已经错了)

我知道这有点奇怪,但就在我的项目中,在某些情况下默认值​​由前面的参数生成的结果。不漂亮但很舒服。这一改变缩短了我的代码。
$serviceLocator->get('router')->setDefaultParam('extra', 'changed-value');