CakePhp Router: подключиться, я не понимаю синтаксис - PullRequest
0 голосов
/ 27 апреля 2011

Я пытаюсь подключить следующие URL:

1) /food/tips
2) /happiness/tips/best_tips

К следующим объектам:
1) controller=tips/ action=index / passed_parameters=food
2) controller=tips / action=index / passed_parameters=(happiness,best_tips)

- правка -
Эти маршруты не являются фиксированными.
Значение: чтоЯ пытаюсь сделать так, чтобы каждый URL, который имеет tips в качестве действия, направлял к контроллеру подсказок любое фиксированное (достаточно хороший индекс) действие и связывал остальную часть URL, как это было в исходном вызове.Что-то вроде /any_controller/tips/any_param до /tips/index/any_params
- конец редактирования -

Надеюсь, что теперь есть какой-то смысл.

Как это сделать?(пожалуйста, объясните также)

Спасибо

Ответы [ 3 ]

1 голос
/ 27 апреля 2011

Я бы порекомендовал прочитать главу «Маршрутизация» книги, так как она объясняет вещи лучше, чем я, и вставлять ее здесь нелепо.

http://book.cakephp.org/#!/view/948/Defining-Routes

Ради объяснения я попытаюсь,

Router::connect('/food/tips', array('controller' => 'tips', 'action' => 'index', 'food'));
Router::connect('/happiness/tips/best_tips', array('controller' => 'tips', 'action' => 'index', 'happiness','best_tips'));

Это должно заставить вас работать.По сути, вы сообщаете Cake Routing, какой URL вы хотите, чтобы он захватывал, поскольку он будет делать это с помощью Regex.Затем вы хотите сказать, какой код вы хотите запустить.Таким образом, для этого требуется пара Controller и Action.

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

1 голос
/ 27 апреля 2011

вся маршрутизация выполняется через вызов Router :: connect («что поймать», «куда отправить»);

, поэтому все может быть просто:

Router::connect('/food/tips', '/tips/index/food');

или предпочтительный метод (используя торты, встроенные в построитель URL)

Router::connect('/food/tips/*', array('controller' => 'tips', 'action' => 'index', 'food');

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

Второй метод использует торты, встроенные в формирователь URL, который принимает массив с ключами контроллера и действиями (есть и другие варианты: http://api.cakephp.org/class/router#method-Routerurl)секунда предпочтительнее из-за правильного форматирования и будущей гибкости (я полагаю).

любые переданные параметры во втором методе просто передаются как неназванные элементы в массиве. именованные параметры просто передаются как ключевые элементы.если бы я хотел создать URL-адрес, подобный этому

/ posts / index / find: all / page: 2

, я бы написал URL-адрес следующим образом:

Router::connect('/url_to_catch', array('controller' => 'posts', 'action' => 'index', 'find' => 'all', 'page' => 2);

Так что простоВ завершение, я бы на самом деле передал ваш параметр с именем:

Router::connect('/happiness/tips/best_tips', array('controller' => 'tips', 'action' => 'index', 'items' => array('happiness', 'best_tips'));

, что потребовало бы функцию в вашем контроллере подсказок, которая выглядит следующим образом:

function tips(){ $this->passedArgs['items']; }
1 голос
/ 27 апреля 2011

Это довольно просто, просто проверьте конфигурацию Router в руководстве . Вы должны использовать метод connect из класса Router. Это принимает 2 параметра. Сначала ваш желаемый маршрут (например, food/tips), а затем массив с фактическим путем, которому он должен следовать. Так что для ваших примеров вы бы сделали что-то вроде этого:

Router::connect('/food/tips', array('controller' => 'tips', 'action' => 'index', 'food');
Router::connect('/happiness/tips/best_tips', array('controller' => 'tips', 'action' => 'index', 'happiness', 'best_tips');

Это эквивалентно вызову TipsController->index('food') и TipsController('happiness', 'best_tips) соответственно.

Однако ваши маршруты выглядят немного забавно. Соглашение Cake для маршрутов - /controller/action/param1/param2/etc, где параметры param1 и т. Д. Являются необязательными, и действие index предполагается, когда никакое другое действие не задано.

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

Так что мое предложение касается tips/food и tips/happiness/best_tips вместо маршрутов, которые вы предлагаете. Таким образом, вам не нужно настраивать маршрутизатор.

UPDATE

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

Router::connect('/:section/tips/:param', 
    array('action' => 'index'), 
    array(
        'section' => '[a-z]*', 
        'param' => '[a-z]*'
    )
);

UPDATE2

Извините, я протестировал вышеописанное, и, похоже, он не работает.

...