2010-06-13 3 views
1

это мое первое сообщение здесь :)Каков правильный способ использования URL-адресов CakePHP?

У меня возникли трудности с использованием URL-адресов и параметров. Я много раз просматривал документацию api класса маршрутизатора и не нашел ничего полезного.

Прежде всего, я хотел бы знать, существует ли какой-либо «универсальный» формат в CakePHP (1.3) для обработки URL-адресов. В настоящее время я обрабатываю все мои URL-адреса как простые массивы (в том формате, который принимает Router :: url и $ html->), и это легко, поскольку мне нужно передать их только в качестве аргументов для собственных методов торта. Обычно мне сложно, если мне нужно что-то еще.

В основном у меня возникают проблемы с преобразованием строковых URL-адресов в формат базового массива. Скажем, я хочу, чтобы преобразовать $ arrayUrl в строку и чем снова в URL:

$arrayUrl=array('controller'=>'SomeController','action'=>'someAction','someValue'); 
$url=Router::url($arrayUrl);  //$url is now '/path/to/site/someController/someAction/someValue' 
$url=Router::normalize($url);  //remove '/path/to/site' 
$parsed=Router::parse($url);  /*$parsed is now 
Array(
    [controller] => someController 
    [action] => someAction 
    [named] => Array() 
    [pass] => Array([0] => someValue) 
    [plugin] => 
) */ 

Это кажется очень много кода, чтобы сделать что-то же просто, как конвертировать между 2 основных форматов. Также обратите внимание, что $ parsed все еще не совпадает с $ arrayUrl. Конечно, я мог бы настроить $ parsed вручную, и фактически я сделал это несколько раз как быстрый патч, но я хотел бы разобраться в этом.

Я также заметил, что при использовании префиксной маршрутизации $ this-> params в контроллере имеет префикс, встроенный в действие (т.е. [action] => 'admin_edit'), а результат Router :: parse() не , Оба, конечно, имеют префикс в собственном ключе.

Подводя итог, как можно преобразовать URL-адрес между любыми из этих 3 (или 4, если вы включите префикс) указанные форматы в правильном направлении? Конечно, было бы легко взломать мой путь через это, но я все же хотел бы поверить, что торт разрабатывается кучей людей, у которых гораздо больше опыта и понимания, чем у меня, поэтому я предполагаю, что есть веская причина для этого «воспринимаемого неправильного поведения».

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

ответ

2

«Официальный» формат для URL-адресов Cake должен быть обозначением массива array('controller' => 'foo', 'action' => 'bar', 'baz', 'admin' => true). Всякий раз, когда вы пишете URL-адреса, вы должны использовать этот формат. Класс Router преобразует их в строки (/admin/foo/bar/baz) или информацию, необходимую для Диспетчера (array('named' => array(), 'pass' => array(), …)), в зависимости от того, где используется URL.

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

Возможно, вы могли бы объяснить примером, почему вам нужно преобразовать эти три формы из одного в другое?

+0

Спасибо за быстрый ответ. Я спросил об этом, потому что не функция Sake, которую я знаю, возвращает этот (массив) формат. В отсутствие реального примера, давайте использовать $ controller-> referer(). Результат referer() - это строка, которую мне нужно преобразовать в массив, чтобы ее изменить. Единственный способ, которым я знаю, это Router :: parse(), который возвращает параметры диспетчера. Если бы я хотел сравнить результат с URL-адресом массива, мне также пришлось бы преобразовать URL-адрес массива в параметры диспетчера, который выполняется через Router :: parse (Router :: normalize (Router :: url ($ arrayUrl))). Нехорошо. – jpeltoniemi

+0

@Pichan Реферрер - интересный случай в том, что это то, что вы можете проанализировать, но в то же время что-то, на что вы не должны уделять такое внимание, в первую очередь. Поскольку у вас действительно не хватает примера, кажется, мой совет стоит. :) – deceze

+0

Предположим, мне нужно сохранить текущий URL-адрес для сеанса, поэтому, когда после выполнения определенной задачи посетитель возвращается на страницу, откуда возникла задача. До сих пор я использовал $ this-> params, который не совпадает с URL-адресами массива, поэтому для того, чтобы они играли хорошо, нужно немного поработать. Я просто хочу, чтобы у вас не было жестких URL-адресов, которые уже доступны контроллеру в некотором формате. Я начинаю думать, что Торт не будет работать со мной на этом, но разве это только торт или мое мышление ошибочно? В конце концов, я довольно зеленый для всего MVC, так что это не было бы сюрпризом :) – jpeltoniemi

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