Маршрутизация конфигурации и параметров действия контроллера для простого перенаправителя URL - PullRequest
1 голос
/ 29 октября 2009

Я пытаюсь сделать простой контроллер перенаправителя в CakePHP. Я хотел бы, чтобы URL был в форме:

http://example.com/redirector/<numeric id>/<url to redirect to>

Например,

http://example.com/redirector/1/http://www.google.com

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

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

class RedirectsController extends AppController {

    function myredirectaction($id, $url) {
        $this->autoRender = false;
        $this->redirect($url);
    }

Кажется, что, что бы я ни пытался, символы "/" в url-to-redirect-to путают мою попытку маршрута и разбивают URL-адрес на части, и это больше не соответствует моему определению действия. Что мне делать?

Я новичок в PHP и CakePHP, поэтому любые советы, которые вы можете дать, приветствуются.

Обновление:

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

http://example.com/redirector/1/http%3A%2F%2Fwww.google.com

Однако моя маршрутизация все еще не работает. Вот что у меня есть вways.php:

Router::connect(
    '/redirector/:id/:url',
    array('controller' => 'redirects', 'action' => 'myredirectaction'),
    array(
        'id' => '[0-9]+',
        'url' => 'http.*'
    )
);

Это то, что я получаю, когда пробую этот URL:

Warning (2): array_merge() [function.array-merge]: Argument #1 is not an array [CORE/cake/dispatcher.php, line 301]

Code | Context

$fromUrl    =   "redirector/1/http://www.google.com"
$params =   array(
    "pass" => array(),
    "named" => array(),
    "id" => "1",
    "url" => "http://www.google.com",
    "plugin" => null,
    "controller" => "redirects",
    "action" => "myredirectaction",
    "form" => array()
)
$namedExpressions   =   array(
    "Action" => "index|show|add|create|edit|update|remove|del|delete|view|item",
    "Year" => "[12][0-9]{3}",
    "Month" => "0[1-9]|1[012]",
    "Day" => "0[1-9]|[12][0-9]|3[01]",
    "ID" => "[0-9]+",
    "UUID" => "[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}"
)
$Action =   "index|show|add|create|edit|update|remove|del|delete|view|item"
$Year   =   "[12][0-9]{3}"
$Month  =   "0[1-9]|1[012]"
$Day    =   "0[1-9]|[12][0-9]|3[01]"
$ID =   "[0-9]+"
$UUID   =   "[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}"
$url    =   array(
    "url" => "/redirector/1/http://www.google.com"
)

array_merge - [internal], line ??
Dispatcher::parseParams() - CORE/cake/dispatcher.php, line 301
Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 118
[main] - APP/webroot/index.php, line 88

И еще несколько предупреждений от моего действия, поскольку оно не получило двух ожидаемых аргументов.

Конечно, я изменил свое действие на urldecode ($ url) перед использованием $ url.

Ответы [ 3 ]

2 голосов
/ 29 октября 2009

Чтобы разместить косую черту и другие специальные символы, используйте вместо этого их коды ACSII. Список кодов и соответствующих им символов приведен в этой документации:

http://www.ascii.cl/htmlcodes.htm

1 голос
/ 30 октября 2009

Вам нужно добавить массив для передачи переменных в ваше действие.

Router::connect(
        '/redirector/:id/:url',
        array('controller' => 'redirects', 'action' => 'myredirectaction'),
        array(
                'id' => '[0-9]+',
                'url' => 'http.*',
                'pass' => array('id', 'url')
        )
);

Дополнительную информацию о причинах вы можете найти здесь: http://book.cakephp.org/view/543/Passing-parameters-to-action

0 голосов
/ 30 октября 2009

Я не могу заставить эту работу работать с URL-адресом, на который я изначально надеялся. Лучшее, что я смог сделать, это указать URL-адрес для перенаправления в параметрах. Так что маршрутизация становится просто:

Router::connect(
        '/redirector',
        array('controller' => 'redirects', 'action' => 'myredirectaction')
);

И действие контроллера становится (обработка ошибок опущена):

function myredirectaction() {
    $this->autoRender = false;
    $redirect_url = $this->params['url']['theurl'];
    $this->redirect($redirect_url);
}

И URL имеет вид:

http://example.com/redirector?theid=1&theurl=http://www.google.com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...