CakePHP Routing - [home] / slug как URL - PullRequest
1 голос
/ 02 июня 2011

Я пытаюсь разобраться с маршрутизацией 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 генерировать маршруты на лету.

Ответы [ 2 ]

9 голосов
/ 02 июня 2011

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

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

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

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_-]+'
    )
);

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

function view(){
    if(isset($this->params['slug'])){
        //Do something with your code here.
    }
}
3 голосов
/ 02 июня 2011

Прежде всего, вы не подключаете 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.

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

...