2015-07-12 3 views
6

Я пытаюсь преобразовать cakephp 2.x в 3.x. Я использовал правила Router::connect(), но я пытаюсь преобразовать их в объемную версию.Cakephp 3 маршрутизация с параметром языка

Что касается правила маршрутизации myold, в config/routes.php Я добавил это.

Router::defaultRouteClass('Route'); 
    Router::scope('/', function ($routes) { 

    $routes->connect('/:language/:controller/:action/*', ['language' => 'ar|de|en|fr']); 
    $routes->connect('/:language/:controller', ['action' => 'index', 'language' => 'ar|de|en|fr']); 
    $routes->connect('/:language', ['controller' => 'Mydefault', 'action' => 'index', 'language' => 'ar|de|en|fr']); 

    $routes->redirect('/gohere/*', ['controller' => 'Mycontroller', 'action' => 'myaction'], ['persist' => array('username')]); 

    $routes->connect('/', ['controller' => 'Mydefault', 'action' => 'index']); 

    $routes->fallbacks('InflectedRoute'); 
}); 
  • Но это терпит неудачу в example.com/en/works. Я получаю эту ошибку: Error: worksController could not be found. Потому что мой файл контроллера WorksController.php.

Содержит ли имя контроллера часть под предлогом казеина cakephp 3? http://book.cakephp.org/3.0/en/intro/conventions.html#controller-conventions

  • Также example.com/foo/bar дает эту ошибку: Error: barController could not be found.. Но foo является контроллером и bar является действием.

Как я могу исправить эту проблему маршрутизации?

Редактировать:
Изменение Route::defaultRouteClass('Route') до Route::defaultRouteClass('InflectedRoute') Решение проблемы 1. Но проблема 2 существует.

+0

Там должна быть строка 'Route :: defaultRouteClass («Маршрут») 'вверху ваших маршрутов.php. Измените его на 'Route :: defaultRouteClass ('InflectedRoute')'. – ADmad

+0

Эта фиксированная ошибка 1. Но существует ошибка 2. Когда я вхожу в 'example.com/foo/bar', cakephp ищет barController. – trante

ответ

5

Параметры, такие как шаблоны элементов маршрута, должны быть переданы через третий аргумент Router::connect(), аргумент $options.

Этот маршрут

$routes->connect('/:language/:controller', ['action' => 'index', 'language' => 'ar|de|en|fr']); 

будет поймать ваш /foo/bar URL, он будет соответствовать foo для :language элемента и bar для :controller элемента.

Правильный способ определения маршрута является

$routes->connect(
    '/:language/:controller', 
    ['action' => 'index'], 
    ['language' => 'ar|de|en|fr'] 
); 

Другие маршруты должны быть адаптированы соответствующим образом.

Смотрите также Cookbook > Routing > Connecting Routes

1

Лучший способ использует маршрутизации прицелы

<?php 
$builder = function ($routes) { 
    $routes->connect('/:action/*'); 
}; 
$scopes = function ($routes) use ($builder) { 
    $routes->scope('/questions', ['controller' => 'Questions'], $builder); 
    $routes->scope('/answers', ['controller' => 'Answers'], $builder); 
}; 

$languages = ['en', 'es', 'pt']; 
foreach ($languages as $lang) { 
    Router::scope("/$lang", ['lang' => $lang], $scopes); 
} 

Router::addUrlFilter(function ($params, $request) { 
    if ($request->param('lang')) { 
     $params['lang'] = $request->param('lang'); 
    } 
    return $params; 
}); 

Код взят из:

https://github.com/steinkel/cakefest2015/blob/c3403729d7b97015a409c36cf85be9b0cc5c76ef/cakefest/config/routes.php

Смежные вопросы