4

これは、1 つのコントローラーで通常の呼び出しと ajax 呼び出しを処理するための良い方法ですか?

<?php

class SomeController extends Controller {

    function index() {

         if(!$this->input->is_ajax_request()) {
             // load model
             // create form
             // pass data to view
             // ...
         } else {
            // validate input
            // load model
            // write data to database
            // return with some json string
         }

    }

}

長所と短所は何ですか?

4

4 に答える 4

3

簡単な答え:場合によります。

XHR (マーケティング担当者が「AJAX」と呼ぶもの) と通常のブラウザー リクエストとの違いは、XHR が別の形式の応答を期待することだけです。

Web の MVC にヒントを得たパターンでは、応答の生成を担当する部分はビューインスタンスです。ビューは、生成する必要がある応答の種類を認識し、それに応じて動作する必要があります。このシナリオでのコントローラーの役割は、現在のビューの状態を変更することだけです。

または、ブートストラップ段階でAcceptHTTP ヘッダーを検出し、それに基づいて別のビュー インスタンスを初期化することもできます。

「ビューを完全に実装する」とは、MVC トライアドに UI ロジックを含み、応答する対象を決定できるインスタンスを意味します。この応答は、複数のテンプレートから構成される HTML ドキュメント、JSON/XML ファイル、または単純な HTTP ヘッダーにすることができます。

  • 長所:関心の適切な分離、保守の容易さ
  • 短所:完全な MVC を実装する必要がある

..しかし、ほとんどの人は完全な MVC 実装を使用していません。

あなたが、MVC にインスパイアされたパターンの代わりに、Rails のようなページ コントローラーパターンのバリエーションを使用する人の 1 人である場合は、XHR を処理するための別のコントローラーを作成する必要があります。

このシナリオでは、実際のビューではありません。UIロジックがページコントローラーにマージされている間、ダムテンプレートに置き換えられます。この状況で唯一の実用的なオプションは、XHR を処理する別のコントローラーを作成することです。

  • 長所:小規模プロジェクトでの実装が簡単
  • 短所:コードの繰り返しの可能性、保守が困難
于 2012-11-08T13:59:02.900 に答える
2

AJAXリクエストの場合でも、入力を検証する必要があります。アプリに(AJAXを介して)入力を送信するのではなく、信頼できないブラウザーです

一般的な設計原則として、特別な場合は避けてください(ここでは、ajaxとnon-ajax)。一般に、すべてのケースを平等に扱いたいので、直交アプローチになります。

そしてあなたが見ることができるように

class SomeController extends Controller {

    function index() {

         if(!$this->input->is_ajax_request()) {

             // validate input <-- XXX here we need to validate it too

             // load model
             // create form
             // pass data to view
             // ...
         } else {
            // validate input
            // load model
            // write data to database
            // return with some json string
         }

    }

}

これにより、コードが重複します(保守と同期の維持が困難になります)。

あなたのコード、直交アプローチ:

class SomeController extends Controller {

    function index() {
         // load model (takes care of his own validation, the self-containment principle of OOP)
         // coordinate same business logic done by different models
         // return models/data to the view, the framework will decide whether it uses the html or the json view file
    }

}

代わりに、モデル(同じモデルクラス、Zend FrameworkにあるようなFormモデル、またはZF2にあるようなハイドレイティングアプローチがほとんどのジョブを実行できます(Table Gateway、DAOと一緒に( Doctrine 2)、またはモデルの同様のクラス)、およびHTMLとJSONの2つの別個のビューを作成できます。

たとえば、Zend Framework 2では、適切なビューが透過的に選択されるため、「これはAJAXであるかどうか」に関するif/elseは実際にはありません。

最新のPHPフレームワーク(5.3以降)を試して、PHPでアプリの設計にアプローチする方法を理解する必要があります。

于 2012-11-08T13:45:51.830 に答える
0

これは開発者の選択だと思います。これを考慮してください:

これは開発者の選択だと思います。これを考慮してください。私が見たクライアント モバイル サイトの開発。Web ストアとモデル ストアがあります。

/store/model/order.php
/store/controller/order.php
/store/view/order.php

それよりも

/store/model/order_mobile.php
/store/controller/order_mobile.php
/store/view/order_mobile.php

管理は悪夢です。モバイル クライアント用に画像、CSS、複数のコーディングの複製を分離します。現在の解決策は、サイト全体をレスポンシブ デザインに変換することです。

/new-dev-store-responsive/model/order.php
/new-dev-store-responsive/controller/order.php
/new-dev-store-responsive/view/order.php

同じコードですが、よりクリーンです。そして、一部のコードでは PHP 構造を使用し、他のコードでは AJAX 呼び出しをテンプレート内に配置します。やはり管理が大変かもしれません。JSONまたは外部の静的ファイルを使用して処理する方がよいでしょう-したがって、PHPはGET、POSTなどを使用して駆動されます..JavaScriptがある場合、AJAXはPHPで動作します..PHPコードはPHP IMOのままである必要があります..

/new-dev-store-responsive/model/order.php
/new-dev-store-responsive/controller/order.php
/new-dev-store-responsive/view/order.php

//new-dev-store-responsive-cdn.com/assets/js/order.js
//new-dev-store-responsive-cdn.com/assets/css/order.css
//new-dev-store-responsive-cdn.com/assets/imgs/order/checkout.jpg
于 2012-11-08T13:42:45.707 に答える
0

あなたの方法にはいくつかの長所と短所があります。

公開データの投稿については問題ありません。

公開データを取得するには、通常、別のコントローラーで行うことを好みます。多くの場合、データは公開されており、可能な限りデータを取得したいため、ajax チェックさえ行いません。

プライベートデータの投稿/取得については、この両面メソッドを使用しないことを好みます。これは、適切でクリーンな (安全な) コードを使用する方がよいためです...

しかし、すべてはあなたの選択次第です。すべてが可能です!そして、正しい定数とそうでない定数はありません..

于 2012-11-08T13:48:10.523 に答える