1

ルート内に複数のナメクジが関係する質問は見当たりませんでした。

「教師」、「コース」、「科目」というテーブルがあります。それぞれに「ショートカット」と呼ばれるフィールドがあります。

次のようなURLから正しいTeacher.id、Course.id、Subject.idをルーティングしてプルするにはどうすればよいですか。

http://www.domain.com/bowlerae/grade-5/math

ここで、「bowlerae」はTeacher.shortcut、「grade-5」はCourse.shortcut、「math」はSubject.shortcutです。

これを最初にルーティングする方法、各3つの要素のIDをプルする方法(AppControllerまたは必要な個々のコントローラーでこれを実行しますか?)、およびリバースルーティングとページネーションと互換性のあるリンクを構築する方法がわかりません。また、フィールド「ショートカット」には、「teacher_slug」、「course_slug」、「subject_slug」など、テーブルごとに一意の名前を付ける必要がありますか?

現在、routes.phpに3つのモデルをそれぞれロードし、それぞれに対応するIDを取得するようにクエリを実行して(URLのその部分が存在する場合)、それらの値をコントローラーに渡します。しかし、ご想像のとおり、多くのリソースを消費します。

追加の質問/懸念事項(AD7sixおよびその他の場合)

このようなURLが必要な場合

http://www.domain.com/bowlerae

教師のホームページ、またはこのようなURLを指す

http://www.domain.com/bowlerae/grade-5

コースのホームページを指すには、次のようなルートがあります

Router::connect(
    '/:teacher', 
    array('controller' => 'teachers', 'action' => 'view'),
    array(
        'teacher'   => '[a-z0-9]{1}([a-z0-9\-]{2,}[a-z0-9]{1})?',
        'pass' => array('teacher')
));

教師用、およびコース用に以下

Router::connect(
    '/:teacher/:course', 
    array('controller' => 'courses', 'action' => 'view'),
    array(
        'teacher'   => '[a-z0-9]{1}([a-z0-9\-]{2,}[a-z0-9]{1})?',
        'course'   => '[a-z0-9]{1}([a-z0-9\-]{2,}[a-z0-9]{1})?',
        'pass' => array('teacher', 'course')
));

私の懸念は、誰かが次のようなURLに移動した場合はどうなるかということです

http://www.domain.com/accountここで、アカウントは有効なコントローラーですが、有効な教師ではありません

また

http://www.domain.com/bowlerae/students学生は有効な管理者ですが、有効なコースではありません

これらのインスタンスをどのように処理しますか?私はそのようなリダイレクト方法を使用してみました...

TeachersController.php

public function view($tSlug = null) {
    $this->Teacher->id = $this->Teacher->findByShortcut($tSlug);

    if (!$this->Teacher->exists()) {
                  $this->Session->setFlash('This teacher does not exist');
                  $this->redirect(array('controller' => $tSlug));
    }
            else{
            // do this
            } // end else if teacher exists
    } 

次のURLをルーティングすることを期待していました

http://www.domain.com/accountをアカウントコントローラーにルーティングしましたが、

http://www.domain.com/account/index、正しいアカウントコントローラーと正しいインデックスアクションですが、URLの末尾に「/index」が追加されています。

現在のルートでは、コースコントローラーにアクセスしようとしているので、同じリダイレクトメソッドをコースコントローラーに追加しました...

CoursesController.php

public function view($tSlug = null, $cSlug = null) {
    $this->Teacher->id = $this->Teacher->findByShortcut($tSlug);
    $this->Course->id = $this->Course->findByShortcut($cSlug);


    if (!$this->Teacher->exists()) {
                  $this->Session->setFlash('This teacher does not exist');
                  $this->redirect(array('controller' => $tSlug, 'action' => $cSlug));
    }
    elseif (!$this->Course->exists()) {
                  $this->Session->setFlash('This course does not exist');
                  $this->redirect(array('controller' => $tSlug, 'action' => $cSlug));
    }
            else{
            // do this
            } // end else if everything is fine
    } 

残念ながら、リダイレクトが終了しないというエラーが表示されます。

また、そのようなURLのルートを作成しました(教師、コース、または科目が存在しない場合)が、おそらくそれらは正しくありません。

4

1 に答える 1

3

すべてのリクエストをデータベースに対してテストして、ルートと一致するかどうかを確認することは非常に悪い考えです。

ロジックをコントローラーに配置します

簡単な方法の1つは、ルートalaを作成することです。

Router::connect('/*', array('controller' => 'x', 'action' => 'y'));

またはもう少し具体的に:

Router::connect(
    '/:teacher/:course/:subject', 
    array('controller' => 'x', 'action' => 'y'),
    array('pass' => array('teacher', 'course', 'subject')
);

また、最初に使用する他のすべてのルートを必ず宣言してください。次に、次のようなコントローラーアクションを作成します。

XController extends AppController {

    public $uses = array('Teacher');

    public function y($tSlug, $cSlug, $sSlug) {
        $teacher = $this->Teacher->findBySlug($tSlug);
        ...
    }

}

ルート要素を制限する

ルート検証を使用すると、特定のルート要素に一致するものを制限できます。たとえば、教師が5人しかない場合は、スラッグで始まることを確認することで、他のURLが一致しないようにすることができます。

Router::connect(
    '/:teacher/:course/:subject', 
    array('controller' => 'x', 'action' => 'y'),
    array(
        'teacher' => 'rita|sue|bob|larry|mo',
        'pass' => array('teacher', 'course', 'subject')
);

dbから教師のスラッグを読み取りたい場合-dbクエリをキャッシュします。すべてのリクエストでroutesファイルのdbから読み取らないでください。

ルートに何かを修正します

固定文字列を含まないルートを使用するということは、3つのパスセグメントを持つURLがルートと一致することを意味します。ルートに固定されたものを配置することでエラーが発生しにくくなり、リクエストが実際に教師向けであることを確認できます。 、コース、科目の組み合わせ

すなわち

Router::connect('/anything/*', array('controller' => 'x', 'action' => 'y'));

これにより、「このURLはこのルートと一致しますか?」の必要がなくなります。論理-そうであるように、またはそうではない。

于 2013-03-25T20:43:21.450 に答える