Tomek Kobyliński
Tomek Kobyliński

Reputation: 1308

event that adds a parameter to routing

Is it possible to hook up (ideally in the controller) to add an additional parameter to routing?

I know that sounds unclear and at first glance it may sounds ridiculous - because to reach the controller we already must have routing. But I want to change only default variables.

I'll try to explain what I want to achieve:

Config:

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'
                    ],
                ],
            ]
        ]
    ]
];

Controller:

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

}

View

<?php 
  echo "project: ".$this->project; 
  echo $this->url('some',['project'=>1]); // result: "/some/1" 

I know this seems very strange. But for some reason (readable links, seo) is necessary to me.

Upvotes: 0

Views: 54

Answers (1)

BreyndotEchse
BreyndotEchse

Reputation: 2230

Are you sure, you want to change the default param?

if ($this->project == 1) {
    $e->getRouteMatch()->setParam('extra', 'changed-value');
}

You can set default params globally for assembling:

$serviceLocator->get('router')->setDefaultParam('extra', 'changed-value');

There is no way to change the defaults-Property of Zend\Mvc\Router\Http\Segment

If you really need it you must extend this class (but I would not recommend that, because I think your approach is already wrong)

Upvotes: 1

Related Questions