1

私は多くの内部リンクを持つCakePHP Webサイトを持っていますHtmlHelper.

/app/View/MyController/myaction.ctp

<?php
echo $this->Html->link(
    $item['Search']['name'],
    array(
        'controller' => 'targetcontroller',
        'action' => 'targetaction',
        $profileId,
        $languageId
    )
);
?>

デフォルトルートで問題なく動作します:

/app/Config/routes.php

Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));

生成されたリンクは次のようになります/mycontroller/myaction/$profileId/$languageId

ここで、Web サイトの一部に検索エンジンに適した URL (ID の代わりにプロファイル名と ISO-639-1 言語コードを使用) を使用し、新しいルートを追加したいと考えています。

/app/Config/routes.php

Router::connect(
    '/:iso6391/:name.html',
    array('controller' => 'mycontroller', 'action' => 'myaction'),
    array(
        'iso6391' => '[a-zA-Z]+',
        'name' => '[0-9a-zA-ZäöüßÄÖÜ\-]+',
    )
);

また、正常に動作し、着信 URI など/producer/en/TestName.htmlは正しく解釈されます。

しかし、HtmlHelperはまだ のような古い URI を生成しています/mycontroller/myaction/1/1

ドキュメントには次のように書かれています。

逆ルーティングは CakePHP の機能で、すべてのコードを変更することなく URL 構造を簡単に変更できるようにするために使用されます。ルーティング配列を使用して URL を定義すると、後でルートを構成でき、生成された URL が自動的に更新されます。

はルーティングHtmlHelper配列を入力として取得します。つまり、逆ルーティングを使用しています。

うまくいかないのはなぜですか?(呼び出しHtmlHelperを変更せずに) 新しい URL を生成する方法は?HtmlHelper#link(...)

4

1 に答える 1

1

最初に少し説明

技術的には逆ルーティングを使用していません。ご覧のとおり、出力リンクは、/mycontroller/myaction/1/1決定的に一致しません/iso/name.html。のように、決して。そのため、適用されないため、ルーティングはそのルールをスキップします。

コード

これを試して

echo $this->Html->link(
    $item['Search']['name'],
    array(
        'controller' => 'targetcontroller',
        'action' => 'targetaction',
        'iso6391' => $someStringWithIso,
        'name' => $someName
    )
);

ただし、そのためには、パラメーターを渡していないため、ルーティングを少し変更する必要があります (例についてはドキュメントを確認してください)。

Router::connect(
    '/:iso6391/:name.html',
    array('controller' => 'mycontroller', 'action' => 'myaction'),
    array(
        'pass' => array('iso6391', 'name'),
        'iso6391' => '[a-zA-Z]+',
        'name' => '[0-9a-zA-ZäöüßÄÖÜ\-]+',
    )
);

そして、最初の文字列の一致に注意する必要があります/:iso6391/:name.html。このルートをプロジェクト内のすべてのコントローラーとアクションに一致させますか、それとも1 つのコントローラーと1 つのビューだけに一致させますか。すべてのプロジェクトの場合は、念のため、これを使用してください

  /:controller/:action/:iso6391/:name.html

たとえば、Controller1とアクション「ビュー」だけの場合は、使用します

  /controller1/view/:iso6391/:name.html

考慮する必要がある詳細は、使用する拡張子です.html。それは URL で本当に必要ですか? 存在する場合は、Html#link にパラメーターとして追加します

echo $this->Html->link(
    $item['Search']['name'],
    array(
        'controller' => 'targetcontroller',
        'action' => 'targetaction',
        'iso6391' => $someStringWithIso,
        'name' => $someName

        'ext' => 'html'
    )
);

parseExtensionsまた、ルーティング ファイルに追加します。これを読んでください。拡張機能を追加しない方が簡単ですが、それはあなた次第です。

結局、あなたはまだあなたの呼び出しを変更する必要がありますHtml->link...

于 2014-06-27T13:32:59.627 に答える