3

私は現在、Laravel 4 フレームワーク上に構築された cms に取り組んでいます。Blade テンプレート システムを使用してモジュール ビューをページ ビューに含めることができる、Pyro CMS に似たプラグイン システムを構築しようとしています。

正常に送信された場合、ユーザーを特定の URL にリダイレクトするか、単に既存のページにリダイレクトするコンタクト フォーム プラグインを構築しています。

私の連絡先フォームクラスのコードは次のとおりです。

class Contact {

public static function form($params)
{
    //get params and execute relevant logic here

    $redirect = isset($params['redirect']) ? $params['redirect'] : Request::url();

    $data = Input::all();

    if($data)
    {
        // Run validation and send message here
        return Redirect::to($redirect)
    }

    return View::make('contact_form_view');
}

}

使用されるルートに応じて適切なページ ビューを表示するページ コントローラーがあり、ユーザーが連絡先フォームを任意のページ テンプレートにドロップし、以下に示すようにテンプレート ビュー内からフォーム関数を呼び出すことで簡単にカスタマイズできるという考えがあります。

<html>
    <head>
    </head>
    <body>

        {{ Contact::form(array(

            'to' => 'myemail@mydomain.com',
            'view'  => 'contact_form_1',

        )) }}

    </body>
</html>

これは、リダイレクトを除いてすべて正常に機能します。フォームが正常に送信され、メッセージが送信されると、ページが更新され、連絡先フォームの代わりに次のメッセージが表示されます

HTTP/1.0 302 Found Cache-Control: no-cache Date: Tue, 17 Sep 2013 09:14:16 GMT Location: http://localhost:8888/my_initial_route Redirecting to http://localhost:8888/my_new_route.

約 2 秒後にリダイレクトが行われ、ブラウザはユーザーが $params 配列で指定したルートにリダイレクトされます。リダイレクトが指定されていない場合は、上記の例のように現在のページにリダイレクトされます。

なぜこれを行っているのかについての提案と、解決策は素晴らしいでしょう。

ありがとう!


編集:

上記のアプローチを採用した理由を簡単に説明すると、問題の理解に役立つ可能性があります。

プロジェクトの要件は、最終的に cms を使用する開発者が、[ページの追加] ボタンをクリックして、cms コントロール パネルを介して無限の量のページを作成できることです。アイデアは、作成する新しいページごとに新しいページ コントローラーを作成するわけではないということです。それを念頭に置いて、次のルートがあります。

Route::any('{page_slug}/page', array('as' => 'frontend.page', 'uses' => 'FrontendPagesController@display_page'))->where('page_slug',  '[-A-Za-z0-9_-]+');

display_page大幅にスリム化された機能は次のとおりです。

public function display_page($slug)
{
    $page = PagesModel::getPageBySlug($slug);
    return View::make($page['view_name']);
}

これにより、ユーザーはボタンをクリックしてページを作成し、名前とスラッグを付けることができます。アプリは、新しいルートを追加することなく、そのページと、ページの作成時に定義された対応するビューを表示できます。 、コントローラーなど

この問題は、ユーザーがページに連絡先フォームを含めたい場合に発生します。フォームを追加するかどうか、どのフィールドを使用するか、どのような検証が必要かをどのように知ることができますか? 開発者が cms コードに触れることなく、完全にカスタムの連絡先フォームを任意のページに追加できる方法が必要です。これに対する私の解決策は、上記のアプローチでした。開発者はタグをビューにドロップし、フォーム機能をカスタマイズするいくつかのパラメーターを関数に渡します。

このContact::form()関数は、フォームのコントローラーのようなものです。from html を含むビューを取得して返し、送信を処理し、結果に応じて成功/エラー メッセージを返します。

必ずしも上記のアプローチを使用する必要はありませんが、コンタクト フォーム コントローラーをページ コントローラーから分離し、開発者が cms バックエンド コードに触れることなく任意のページにフォームを追加できるようにする方法が必要です。

これに関するアイデアは素晴らしいでしょう。

4

4 に答える 4

6

redirectビューからではなく、コントローラーから呼び出す必要があります。これは、あなたがすでにビューにいて、それが表示されているために発生しているため、何らかの方法でそれ (ボディ) を非表示にできる場合、リダイレクトが発生する前に表示されません。

しかし、あなたはそれを間違っていますanti-pattern.IMO. コントローラーを使用して決定を下し、ビューはプレゼンテーションにのみ使用する必要があります。これは、MVCフレームワークの非常に基本的なルールです。

于 2013-09-17T18:39:42.133 に答える
1

ビューで関数を呼び出すと、表示される HTML が返されます。たとえば、呼び出すとhttp://yoursite.tld/foo{{ Url::to('foo') }}が生成されます。

を呼び出すと{{Contact::form(...)}}、HTML が出力されます。を返すView::make(...)と、HTML が返されます。を返すRedirect::to(...)と、Laravel ルーターが解析してリダイレクト ヘッダーに変換する Laravel オブジェクトが返されます。

リダイレクトは、Route オブジェクトまたはコントローラーのいずれかによって呼び出される必要があります。フォームの送信をコントローラーで処理する場合は、そこにリダイレクトを配置します。

于 2013-09-17T18:08:56.323 に答える
0

これとまったく同じ問題が発生し、「4.0.*」にダウングレードされて修正されました。

これは 4.1.x の問題のようです。

ダウングレードする手順

composer.json を次のように変更します。

"require": {
    ...
    "laravel/framework": "4.0.x",
    ...
}

app.php の編集 - 「コントローラー」エイリアス

'Controller'      => 'Illuminate\Routing\Controller',

なるはず

'Controller'      => 'Illuminate\Routing\Controllers\Controller',

これらのサービス プロバイダを削除する必要がありました

'Illuminate\Remote\RemoteServiceProvider',
'Illuminate\Exception\LiveServiceProvider',

編集:

私は Github でこれに関する問題を開いており、以前に Taylor が修正しました。composer update を実行すれば問題ないはずです。

于 2013-09-20T17:41:00.340 に答える