0

クリーン URL を使用して検索モジュールを実装しようとしています。www.website.com/search/ searchtermのようなもの。EWZSearchBundle を使用して検索可能なインデックスを作成したので、関連するデータベースがないため、エンティティは必要ありません。

public function searchAction(Request $request)
{
    $form = $this->createFormBuilder()
        ->add('query', 'text')
        ->getForm();

    if('POST' === $request->getMethod()){
        $form->bind($request);
        if ($form->isValid()) {
            return $this->redirect($this->generateUrl('search_process', array('query' => $request->query->get('query'))));
        }

    }

    return array(
        'form'   => $form->createView(),
    );
}

エンティティのない単純なフォームを作成し、フォーム アクションをそれ自体に送信しました。POST リクエストの場合は、フォームを検証し、クリーンな URL (www.website.com/search/ searchterm ) を使用して検索プロセスに送信します。

public function searchProcessAction($query)
{
    $search = $this->get('ewz_search.lucene');
    $results = $search->find($query);

    return array(
        'results'   => $results,
    );
}

検索プロセスでは、クリーンな URL から検索用語を取得し、インデックスで検索して結果を返します。それは非常に単純なプロセスのはずです。問題は 1 つだけです。

Entity を使用する必要がないため、POST リクエストになることも、 の中に入ることもありませんif('POST' === $request->getMethod())。また、GET リクエストになることで、URL をきれいに保つという私のすべてが台無しになります。

私は自分のやり方と余分なリダイレクトを行うことを知っていますが、検索用にきれいな URL を維持する方法が他にわかりません。プロセス全体に関する提案を受け付けています。

4

3 に答える 3

2

いくつかの考え:

  • 経験則により、検索アクションは GET メソッドを介して実行する必要があります。何も作成していません。結果を得るためにサイトにクエリを実行しているだけです。

  • きれいなURLは素晴らしいものですが、検索機能は依然として古き良きクエリ構文 [ http://path.to/search?q=termToSearchFor] を利用する必要があります。この方法では、クエリ文字列がキャッシュされることはなく、常に更新されたコンテンツを確実に取得できます [サーバー側でキャッシュ動作を指定する必要はありません]。

  • 特定のトラフィックからデータを保護することに関心がある場合は、認証または CSRF トークンをフォームに実装することを検討してください。

  • これに関して:

エンティティを使用する必要がないため、POST リクエストになることはなく、if('POST' === $request->getMethod()) 内に入ることがなく、GET リクエストになったので、 URLをきれいに保つことについての私のすべてを台無しにします。

これは単純に間違っています。POST リクエストはエンティティとは何の関係もありません。サーバーに特定の動作を要求するために、リクエスト ヘッダーで指定するモードにすぎません。

/search/{query}として定義し、次のようにアクションを更新すると、URL は引き続き「クリーン」になります。

public function searchAction($query){ ... }

しかし、前に述べたように、クエリ構文は検索動作にはまったく問題なく、そのようなタスクに POST を使用するべきではありません。

RESTful 原則に関するスマートな読み物 - http://tomayko.com/writings/rest-to-my-wife

于 2012-11-29T10:44:49.453 に答える
1

POSTメソッドを使用してフォームを送信する必要があります。

HTMLで

<form action="YOUR ACTION" method ="post">

他の方法(GET)でこのリンクに誰もアクセスしないようにする場合は、ルーティングを変更します

rule_name:
  pattern: /search/{query}
  defaults: { _controller: AcmeBundle:Search:search }
  requirements:
    _method:  POST
于 2012-11-29T10:34:12.727 に答える
0

フォームコンポーネントを使用せずに、なんとか機能させることができました。フォームを手動で作成し、@moonwave99によって提案されたクエリ文字列形式も受け入れました。フォームコンポーネントを使用すると、form[query]やform[_token]のような長い名前が付けられ、URLでそのフォームのCSRFトークンが送信されます。フォームを手動で作成すると、クエリ文字列形式のURLをより適切に制御できます。

注:同時に、その特定のフォームからCSRFセキュリティが削除されることに注意してください。

すべての答えをありがとう。

于 2012-12-03T07:23:09.963 に答える