Локаль Zf2 в URL и $this-›url

Я разрабатываю веб-приложение на базе ZF2 Skeleton App. Я играл с множеством вариантов, но не смог добиться окончательного прогресса.

Мне нужно направить URL-адрес, как показано ниже:

http://myapp/
http://myapp/en/album

в AlbumController/indexAction. Кроме того, ссылки должны работать как:

http://myapp/en/album/edit/1
http://myapp/en/album/delete/1

Код генерирует правильные URL-адреса, но при нажатии возвращает ошибку "404"

Мое приложение/module.config.php выглядит следующим образом:


return array (
        'router' => array (
                'routes' => array (
                        'home' => array (
                                'type' => 'Zend\Mvc\Router\Http\Literal',
                                'options' => array (
                                        'route' => '/',
                                        'defaults' => array (
                                                'controller' => 'Album\Controller\Album',
                                                'action' => 'index',
                                                'lang'     => 'en',
                                        ) 
                                ) 
                        ),
                        'application' => array (
                                'type' => 'Literal',
                                'options' => array (
                                        'route' => '/application',
                                        'defaults' => array (
                                                '__NAMESPACE__' => 'Application\Controller',
                                                'controller' => 'Index',
                                                'action' => 'index' 
                                        ) 
                                ),
                                'may_terminate' => true,
                                'child_routes' => array (
                                        'default' => array (
                                                'type' => 'Segment',
                                                'options' => array (
                                                        'route' => '[:lang[/album[/:action[/:id]]]]',
                                                        'constraints' => array (
                                                                'lang'     => '[a-z]{2}',
                                                                'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                                                'id' => '[0-9]+'
                                                        ),
                                                        'defaults' => array (
                                                                'controller' => 'Album\Controller\Album',
                                                                'action' => 'index',
                                                                'lang'     => 'en',
                                                        )
                                                ) 
                                        ) 
                                ) 
                        ) 
                ) 
        ),
        'service_manager' => array (
                'factories' => array (
                        'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory' 
                ) 
        ),
        'translator' => array (
                'locale' => 'en_US',
                'translation_file_patterns' => array (
                        array (
                                'type' => 'gettext',
                                'base_dir' => __DIR__ . '/../language',
                                'pattern' => '%s.mo' 
                        ) 
                ) 
        ),
        'controllers' => array (
                'invokables' => array (
                        'Application\Controller\Index' => 'Application\Controller\IndexController' 
                ) 
        ),
        'view_manager' => array (
                'display_not_found_reason' => true,
                'display_exceptions' => true,
                'doctype' => 'HTML5',
                'not_found_template' => 'error/404',
                'exception_template' => 'error/index',
                'template_map' => array (
                        'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
                        'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
                        'error/404' => __DIR__ . '/../view/error/404.phtml',
                        'error/index' => __DIR__ . '/../view/error/index.phtml' 
                ),
                'template_path_stack' => array (
                        __DIR__ . '/../view' 
                ) 
        ) 
);

Мой альбом/module.config.php имеет следующий маршрутизатор:


'router' => array (
                'routes' => array (
                        'album' => array (
                                'type' => 'segment',
                                'options' => array (
                                        'route' => '[:lang[/album[/:action[/:id]]]]',
                                        'constraints' => array (
                                                'lang'     => '[a-z]{2}',
                                                'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                                'id' => '[0-9]+'
                                        ),
                                        'defaults' => array (
                                                'controller' => 'Album\Controller\Album',
                                                'action' => 'index', 
                                                'lang'     => 'en',
                                        )
                                ),
                        )
                )
        ), 

////////////////////////////////////////////////// ////////////////////////////////////// // Теперь все работает нормально.

Кроме того, когда я вызываю $this->url('album',array('action'=>'edit', 'id' => $album->id)); в файле просмотра (.phtml) он не возвращает правильный URL-адрес, как ожидалось:

http://www.myapp.com/en/edit/id/1

////////////////////////////////////////////////// /////////////////////////////////////// //Исправленный код работает для URL $this->url ('album', array('action'=>'edit', 'id' => $album->id)) /////////////////////// ////////////////////////////////////////////////// ///////////////

Заранее оцените вашу помощь.


person ZF2 Student    schedule 22.01.2013    source источник
comment
Для :album нет default и constraint, кроме того, в вашем вызове $this->url() не назначен альбом. На самом деле мне интересно, маршрут вообще создается   -  person Sam    schedule 22.01.2013
comment
Я только что исправил одну проблему с моим кодом: 'route' =› '[:locale[/:album[/:action[/:id]]]]', должно быть 'route' =› '[:locale[ /альбом[/:действие[/:идентификатор]]]]',   -  person ZF2 Student    schedule 23.01.2013
comment
Вы ожидаете edit-items в качестве своего действия, но передаете edit в качестве параметра. Вы также ожидаете /id/1 в качестве последних двух сегментов, но в маршруте [:locale[/:album[/:action[/:id]]]] нет буквальной части id. Это сильно отвлекает от вашего вопроса. Можете ли вы 1) создать минимальный рабочий пример и 2) сформулировать четкий вопрос? Тогда было бы очень полезно ответить на ваш вопрос!   -  person Jurian Sluiman    schedule 23.01.2013
comment
@Sam/@Jurian: Спасибо за полезные ответы. Я обновил код предложениями/исправлениями. Теперь URL-адрес по умолчанию работает нормально, но /en/album и /en/album/edit/1 и т. д. возвращают ошибку 404. Маршруты не разрешаются должным образом. Любые советы о том, где я ошибаюсь.   -  person ZF2 Student    schedule 23.01.2013


Ответы (1)


Проблема отсутствовала '/' в Album/module.config.php:

'route' => '[:lang[/album[/:action[/:id]]]

должны были быть:

'route' => '/[:lang[/album[/:action[/:id]]]

Еще раз спасибо всем за помощь.

person ZF2 Student    schedule 23.01.2013