Первый необязательный сегмент маршрутизации действует как обязательный для дочерних маршрутов.

У меня есть следующее определение маршрутизации:

'admin_default' => array( 
    'type'    => 'segment', 
    'options' => array( 
        'route'    => '[/:lang]/administrator[/:module][/:action]', 
        'constraints' => array( 
            'lang' => '[a-zA-Z]{2}', 
            'module' => '[a-zA-Z0-9_-]*', 
            'action' => '[a-zA-Z0-9_-]*', 
        ), 
        'defaults' => array( 
            'module' => 'Application', 
            'controller' => 'Admin', 
            'action'     => 'index', 
            'lang' => 'ru' 
        ), 
    ), 
    'may_terminate' => true, 
    'child_routes'  => array( 
        'wildcard' => array( 
            'type' => 'wildcard', 
            'may_terminate' => true, 
            'options' => array( 
                'key_value_delimiter' => '/', 
                'param_delimiter' => '/' 
             ), 
        ), 
    ), 
), 

Итак, я не могу избавиться от сегмента [/:lang] в строке URL

Например:

Помощник просмотра URL $this->url('admin_default', array('module' => 'albums')) возвращает следующую строку URL:

/administrator/albums 

в то время как $this->url('admin_default/wildcard', array('module' => 'albums', 'action' => 'edit', 'id' => album_id_here)) возвращает:

/ru/administrator/albums/edit/id/album_id_here 

Как я могу удалить сегмент [/:lang] из строки URL во втором случае?

1 ответ

Так что случилось с этим "ру"?

Вы должны расширить URL помощника Zend View, чтобы вставить текущую локаль в URL

посмотрите, что я сделал для моего текущего проекта:

    <?php

namespace PatrickCore\View\Helper;

use Doctrine\ORM\EntityManager;
use Zend\View\Helper\Url;

class I18nUrl extends Url {

    /**
     * @var String
     */
    protected $lang;
    protected $router;

    public function __construct($locale,$router) {

        $arraylanguagemapping = array(
            'en_US' => 'en',
            'fa_IR' => 'fa'
        );
        $this->lang = $arraylanguagemapping[$locale];
        $this->router = $router;
    }

    public function __invoke($name = null, array $params = array(), $options = array(), $reuseMatchedParams = false) {

        $this->setRouter($this->router);

        if (!array_key_exists('lang', $params)) {
            $params['lang'] = $this->lang;
        }


        return parent::__invoke($name,$params,$options,$reuseMatchedParams);

    }

}

?>
Другие вопросы по тегам