Маршрутизация CakePHP — [home] / slug в качестве URL

#cakephp #routing #cakephp-1.3

#cakephp #маршруты #cakephp-1.3

Вопрос:

Я пытаюсь разобраться с маршрутизацией Cake, но мне не удается найти решение моей конкретной проблемы.

Я хочу сопоставить www.example.com/slug для www.example.com/venues/view/slug, где slug — это понятное для URL-адреса имя записи для определенного места.

Я также хочу затем сопоставить www.example.com/slug/events для www.example.com/events/index/venue:slug .

Прочитав документацию CakePHP по маршрутизации несколько раз, я ничего не понял. Я понимаю, как я мог бы создавать эти маршруты для каждого отдельного места, но я не уверен, как заставить Cake генерировать маршруты на лету.

Ответ №1:

Вы должны быть осторожны, сопоставляя что-либо с первым путем после имени домена. Это означает, что вы нарушаете парадигму контроллера / действия / параметра / param. Вы можете это сделать, но это может означать, что вам нужно определять каждый URL для вашего сайта в файле маршрутов, а не использовать магию маршрутизации Cake.

Альтернативой может быть использование /v / для мест проведения и / e / для событий, чтобы сохранить ваш URL коротким, но разбить URL на части для обычной парадигмы.

Если вы все еще хотите выполнить то, что вы просили здесь, вы могли бы сделать что-то вроде следующего. Это ограничивает slug буквами, цифрами, тире и подчеркиванием.

 Router::connect(
    '/:slug', 
    array(
        'controller' => 'venues', 
        'action' => 'view'
        ), 
    array(
    'slug' => '[a-zA-Z0-9_-] '
    )
);
Router::connect(
    '/:slug/:events', 
    array(
        'controller' => 'events', 
        'action' => 'index'
        ), 
    array(
    'slug' => '[a-zA-Z0-9_-] '
    )
);
  

Затем в вашем контроллере вы могли бы получить доступ к slug с помощью следующего (используя первый маршрут в качестве примера).

 function view(){
    if(isset($this->params['slug'])){
        //Do something with your code here.
    }
}
  

Ответ №2:

Во-первых, вы не подключаетесь www.example.com/slug для www.example.com/venues/view/slug вы подключаетесь /slug к действию контроллера. Вот так:

 Router::connect('/:slug',
                array('controller' => 'venues', 'action' => 'view'),
                array('pass' => array('slug'));
  

Чтобы сгенерировать соответствующую ссылку, вы должны сделать то же самое в обратном порядке:

 $this->Html->link('Foo',
        array('controller' => 'venues', 'action' => 'view', 'slug' => 'bar'))
  

Это должно привести к появлению ссылки /bar .

Проблема с маршрутизацией /:slug URL заключается в том, что это универсальный маршрут. Вам необходимо тщательно определить все другие маршруты, которые вы, возможно, захотите использовать до этого.

Комментарии:

1. Человеку нужен пользовательский класс маршрута

2. @Dunham Делает ли он это сейчас? Зачем?

3. Как вы сказали, теперь он перехватывает все маршруты.

4. Спасибо за комментарий — я не до конца понял передачу параметров в маршрутах. Я вижу трудность в подключении / whatever к чему-либо. Моими первоначальными мыслями было каким-то образом запросить базу данных, является ли / что бы то ни было slug, а затем позволить cake выполнять свои действия по умолчанию, если нет. / места проведения / это slug!