CakePHP 2.x Помощник по обратной маршрутизации ссылок

В моем приложении CakePHP я подключил следующий маршрут:

Router::connect('/:city/dealer/:id', 
    array('controller' => 'dealers', 'action' => 'view'),
    array(
        'pass' => array('city', 'id'),
        'city' => '[a-z]+',
        'id' => '[0-9]+'
        )
    );

Это прекрасно работает и позволяет: domain.com/washington/dealer/1

Но как создать правильную HTML-ссылку в представлении для этого URL-адреса? Если я просто сделаю это:

echo $this->Html->link(
    'Testlink',
    array('washington', 'controller' => 'dealers', 'action' => 'view', 1)
);

Он добавляет все параметры в конец сгенерированной ссылки:

http://domain.com/dealers/view/washington/1

Как мне это сделать правильно?


person Sebastian    schedule 08.10.2012    source источник
comment
Что произойдет, если вы используете '/:city/:controller/:id' для своего маршрута? Вы хотите, чтобы другие контроллеры использовали тот же шаблон?   -  person Lawrence Barsanti    schedule 08.10.2012
comment
Когда я использую '/:city/:controller/:id', Cake жалуется на отсутствие DealerController для domain.com/washington/dealer/1... По сути, в приложении есть только этот контроллер...   -  person Sebastian    schedule 08.10.2012
comment
попробуйте domain.com/washington/dealers/1 (обратите внимание на дилера)   -  person Lawrence Barsanti    schedule 08.10.2012
comment
Форма множественного числа работает, но это не помогает при построении ссылок.   -  person Sebastian    schedule 08.10.2012
comment
Ну, я как бы заставил его работать с абсолютными URL-адресами: $this->Html->link(Link, '/washington/dealers/'.$id.''); Кажется, это действительно плохая практика, поскольку все это перестает работать, если я меняю маршруты. Я был бы рад, если бы кто-то знал лучший способ.   -  person Sebastian    schedule 08.10.2012


Ответы (2)


Я считаю, что вам все еще нужно указать параметры, например:

echo $this->Html->link('Testlink',
    array('controller' => 'dealers', 'action' => 'view', 'city' => 'washington',
                                                         'id'=> 1));

У торта есть похожий пример в кулинарной книге:

<?php
// SomeController.php
public function view($articleId = null, $slug = null) {
    // some code here...
}

// routes.php
Router::connect(
    '/blog/:id-:slug', // E.g. /blog/3-CakePHP_Rocks
    array('controller' => 'blog', 'action' => 'view'),
    array(
        // order matters since this will simply map ":id" to $articleId in your action
        'pass' => array('id', 'slug'),
        'id' => '[0-9]+'
    )
);

// view.ctp
// this will return a link to /blog/3-CakePHP_Rocks
<?php
echo $this->Html->link('CakePHP Rocks', array(
    'controller' => 'blog',
    'action' => 'view',
    'id' => 3,
    'slug' => 'CakePHP_Rocks'
));
person Ross    schedule 08.10.2012
comment
Извините, я должен был упомянуть пример. Проблема в том, что LinkHelper по-прежнему ставит параметры в конец. Это сгенерированная ссылка из примера your/Cakes: domain.com/dealers/ вид/город:Вашингтон/id:1 - person Sebastian; 08.10.2012

Привет, Себастьян, возможно, уже слишком поздно, чтобы помочь тебе, но я могу помочь кому-то еще с этой проблемой. Ключом к решению вашей проблемы является добавление к методу url в классе Helper. Я сделал это, создав AppHelper.php в своем View/Helper. Похоже на это. Я изменил свой параметр на ваш город.

Вид/Помощник/AppHelper.php

<?php
App::uses('Helper', 'View');
class AppHelper extends Helper {

    function url($url = null, $full = false) { 
            if (is_array($url)) { 
                   if (empty($url['city']) && isset($this->params['city'])) { 
                            $url['city'] = $this->params['city']; 
                    }

                    if (empty($url['controller']) && isset($this->params['controller'])) { 
                            $url['controller'] = $this->params['controller']; 
                    }

                    if (empty($url['action']) && isset($this->params['action'])) { 
                            $url['action'] = $this->params['action']; 
                    }
            } 

            return parent::url($url, $full); 
    }

 }
 ?>

Затем я создаю маршруты, такие как

Router::connect('/:city/dealer/:id', 
array('controller' => 'dealers', 'action' => 'view', 'id'=>':id'),
array('pass' => array('city', 'id'),
      'city' => '[a-z]+',
      'id' => '[0-9]+'
));

Надеюсь это поможет :)

person Tass Skoudros    schedule 27.03.2013