Как правильно использовать URL Cakephp? - PullRequest
1 голос
/ 13 июня 2010

это мой первый пост здесь:)

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

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

В основном у меня проблемы с преобразованием строковых 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] => 
) */

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

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

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

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

1 Ответ

2 голосов
/ 13 июня 2010

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

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

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

...