2013-02-26 2 views
1

Во-первых, я понимаю, что было много вопросов и решений по этому поводу, но ни один из них не нашел исправить мою проблему.CakePHP обратная маршрутизация: ссылка Html неверная ссылка

В заключение, помощник Html не реверс правильно и вместо URL-маршрутизации, как это:

http://website.com/user_of_website/slug_name 

Я получаю URL, как это:

http://website.com/things/view/username:user_of_website/slug:a_thing 

Вот мои настройки маршрутизатора:

Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); 
/** 
* ...and connect the rest of 'Pages' controller's urls. 
*/ 
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display')); 

//User routes 
Router::connect('/login', array('controller' => 'users', 'action' => 'login')); 
Router::connect('/logout', array('controller' => 'users', 'action' => 'logout')); 
Router::connect('/register', array('controller' => 'users', 'action' => 'add')); 

Router::connect('/users/:action/*', array('controller' => 'users')); 
Router::connect('/things/:action/*', array('controller' => 'things')); 

Router::connect(
    '/:username/:slug', 
    array(
     'controller' => 'things', 
     'action' => 'view' 
    ),array(
     'username' => '[a-zA-Z0-9_]+', 
     'slug' => '[a-zA-Z0-9_]+', 
     'pass'=>array(
      'username', 
      'slug' 
     ) 
    ) 
); 
Router::connect('/:userName', array('controller' => 'things', 'action' => 'user'),array('pass'=>array('userName'))); 

И мой html хелпер:

echo $this->Html->link('View', array(
    'controller' => 'things', 
    'action' => 'view', 
    'username' => 'user_of_website', 
    'slug' => 'a_thing' 
),array(
    'class' => 'text-warning' 
)); 

Я действительно не вижу, что я делаю неправильно. Любая помощь очень ценится.

NB, я использую CakePHP 2.3

+0

Не знаю, если это влияет на вашу проблему, но последний путь ('/: userName') использует другая нотация (camelcased) * и * не содержит определение/regexp для параметра userName – thaJeztah

+0

@thaJeztah, да, я тестировал что-то, но не было связано. Проблема была в том, когда я тестировал/username/slug links – ST0N3

ответ

1

пытались ли вы, если это работает, если отключить «регулярные» маршруты для things? Например. /things/:action/*.

Я предполагаю, что из-за подстановочного знака этот маршрут будет также соответствовать URL-адресу, и, поскольку он определен до, ваш пользовательский маршрут будет заменен вместо этого.

Если это решит проблему, вы можете попытаться переместить этот маршрут ниже ваш «заказ» по маршруту

+0

Спасибо, что работает. Однако любые ссылки, идущие в/things/action, были пойманы с помощью правила /: username /: slug. Я обошел это, добавив правила выше, которые влияют только на это действие, например./things/add Это нормально, так как есть всего несколько действий. Я должен буду убедиться, что настроил надежный черный список пользователей. Еще раз спасибо. – ST0N3

+0

Рад, что я мог помочь. Вы также можете изменить «имя пользователя» Regexp, чтобы исключить имена контроллеров. ИЛИ (возможно, лучше?) Помещают пользовательские маршруты * ниже * по умолчанию для CakePHP маршрутов. Таким образом, маршруты CakePHP будут сопоставлены перед использованием ваших маршрутов – thaJeztah

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