1

これはベスト プラクティスの質問であり、特定の問題ではありません。私は MVC アプローチと Yii にはかなり慣れていませんが、しばらくの間アプリで開発を行ってきました。ベスト プラクティスと、どのファイル (コントローラー、モデル、ビュー、ヘルパーなど) に何を入れるかについての話を見続けていますが、例に関して具体的なものはまだ見つかりませんでした。

現在、次のような呼び出しがあります:Model::function()ビューファイルと次のようなチェック$var = app()->request->getParam(value, false);

Model::function() や Model::model()->scope1()->scope2()->findAll() のようなコントローラー ファイルに呼び出しがあります。また、コントローラー ファイルが少し太くなっていると思いますが、そうではありません。肥大化の方法と場所を確認してください。DRYについて読んでいますが、いわばコードを正確にDRYしているとは思いません。何がどこにあるのか、また提案や理由について、より明確な図を教えていただけませんか :) アドバイスをいただければ幸いです。事前に感謝します。

ビューファイルでの呼び出しの例を次に示します

<?php
$this->pageTitle = 'Edit Action';
$this->subTitle = '<i>for</i> <b>' . Vendors::getName($_GET['vendor']) . '</b>';
?>

<div class="wrapper">
<?php echo $this->renderPartial('_form', array('model' => $model)); ?>
</div>

getName はモデル内の関数ですが、これはビュー内の関数を呼び出す良い方法ですか?

別のビュー ファイルの例:

<div class="wrapper">
    <?php 

    if($this->action->id != 'create') {
        $this->pageTitle = "New Media Contact";
         echo $this->renderPartial('_form', array('model'=>$model));
    } else {
        $this->pageTitle = "New Vendor";
         echo $this->renderPartial('_form', array('model'=>$model));
    }
    ?>
</div>

$model はタイプのコントローラに設定されています... 同じ質問...これはできますか..クリーナー..? MVC と再利用性/DRY の点で優れていますか?

編集 ここでいくつかの応答を読んだ後、特に。@Simone私は自分のコードをリファクタリングし、それが今どのように見えるかを共有したかった...

public function actionCreate() {
    $model = new Vendors;

    // Get and Set request params
    $model->type = app()->request->getParam('type', Vendors::VENDOR_TYPE);
    $vendorsForm = app()->request->getPost('Vendors', false);
    // Uncomment the following line if AJAX validation is needed
    $this->performAjaxValidation($model);
    if ($vendorsForm) {
        $model->attributes = $vendorsForm;
        if ($model->save())
            $this->redirect(array('/crm/vendors', array('type' => $model->type)));
    }
    $model->categories = Categories::getAllParents($model->type);
    $this->pageTitle = 'New ' . Lookup::item('VendorType', $model->type);
    $this->render('create', array(
        'model' => $model,
    ));
}

およびビュー create.php

<div class="wrapper">
<?php echo $this->renderPartial('_form', array('model'=>$model));?>

すべての応答に感謝します

4

4 に答える 4

3

私はYiiフレームワークにあまり精通していませんが、あなたが言及したいくつかの特定の事柄についていくつかの提案をすることができます:

すべてのデザインパターンMVCを実装でき、場合によってはさまざまな開発者がさまざまな方法で解釈できるように、「ベストプラクティス」にとらわれすぎないでください。では、これはどういう意味ですか?これは、MVCを可能な限り読み上げてから、単に実行することを意味します:o)問題が発生したときに、どのスロットがどこにあるのか、そしてなぜ問題が発生したのかがすぐにわかります(通常、これはどこで発生しますか?所属、コントローラーまたはモデル?...'。

何がどこに行くかに関しては、グーグル/検索stackoverflowまたは無数の本で何をすべきか、どこに行くべきかについての多くの説明を読むことができますが、あなたが提供したコードスニペットから私は提案します:

ビューファイル:(これがYii固有のものでない限り)私の意見では、ビューファイルは少し汚れています。モデルと直接話している(実際には、一部のPHPアプリが「モデルと話すことができる唯一のコントローラー」メソッドを採用しているのではなくMVCの古典的なアプローチです)が、ビューがリクエストデータを取得しようとしているようです直接、そして私にとって、これはビューの近くにあるべきではありません。コントローラは、検証用のモデルを使用して要求を処理し、出力をビューに渡す必要があります。

モデル:これは小さなスニペットからは問題ないように見えますが、一般的に覚えておくべき重要なことの1つは、モデル!=データベースです(一部の人々の提案にも関わらず)。

コントローラー:スニペットからは問題ないように見えますが、コントローラーの肥大化に対処するには、コントローラーの1つが表示されない限り、提案を提供するのは困難です。常に検討する価値のあることの1つは、サービスの使用です。基本的に、サービスを使用すると、反復的で複雑なモデルを多数カプセル化することで、コントローラーを大幅に簡素化できます。したがって、コントローラー内で個別の検証モデルと永続性モデルを呼び出す代わりに、サービスクラスをインスタンス化するだけで、1つのメソッドを呼び出す場合があります(コントローラーに操作の成功または失敗を示すブール値を返すことがよくあります)次に、コントローラーは、アプリのフローを最適に処理する必要があります(つまり、別のページにリダイレクトしたり、エラーを表示したりする必要があります)。

于 2012-05-31T23:30:38.933 に答える
2

コードをリファクタリングする例を示します。これはあなたのコードです

<div class="wrapper">
    <?php 
        if($this->action->id != 'create') {
            $this->pageTitle = "New Media Contact";
            echo $this->renderPartial('_form', array('model'=>$model));
        } else {
            $this->pageTitle = "New Vendor";
            echo $this->renderPartial('_form', array('model'=>$model));
        }
    ?>
</div>

最初の質問は、なぜ renderPartial で同じ行を 2 回書くのですか? 最初のリファクタリング:

<div class="wrapper">
<?php
    if($this->action->id != 'create') {
        $this->pageTitle = "New Media Contact";
    } else {
        $this->pageTitle = "New Vendor";
    }
    echo $this->renderPartial('_form', array('model'=>$model));
?>
</div>

そして今、2番目のステップ:

<?php $this->pageTitle = $this->action->id != 'create' ? "New Media Contact" "New Vendor"; ?>

<div class="wrapper">
 <?php echo $this->renderPartial('_form', array('model'=>$model)); ?>
</div>

FOR ME の方が読みやすいです。ベストプラクティスがたくさんあると思います。ただし、悪いコンテキストで使用される悪い習慣になる可能性があります。だから... 本当に便利な書き換えコードですか? 私にとってはそうです!私の目標はコードの保守性です。読みやすく、管理しやすい。ただし、自分の基準またはチームの基準を見つける必要があります。また、コントローラー内のあらゆる種類のロジックを移動することを好みます。たとえば、コントローラーでデフォルトの pageTitle を設定し、それを actionCreate メソッドで再定義できます。

class SomeController extends CController
{

    public $pageTitle = "New Vendor";

    function actionCreate ()
    {
        $this->setPageTitle("New Media Contact")
        $this->render('view');
    }

}

そして、私のビューファイルは次のようになります:

<div class="wrapper">
    <?php echo $this->renderPartial('_form', array('model'=>$model)); ?>
</div>

物事の責任を理解する必要があると思います。ビューは単なるビューです。

于 2012-06-01T04:13:15.447 に答える
0

ビューは、単にデータを表示するだけのコンポーネントと考えてください。データベース呼び出し、モデルとの対話、新しい変数の作成 (またはごくまれに) などを行うべきではありません。チェックを実行したい場合、またはデータを使用して HTML ブロックを作成したい場合などは、その目的のためにヘルパーを使用します。
ビューが表示するデータはコントローラーから取得されます。

コントローラーは、アプリでほとんどの作業を行うマエストロです。リクエストに応答し、必要に応じてモデルにデータを要求し、データをビューに渡してレンダリングします。

最初の例では、変数をコントローラに保存Vendors::getName($_GET['vendor'])し、それをビューに渡します。
また、すべてmodelの のデータが必要ない場合は、オブジェクト全体を渡さないでください。

2 番目のスニペットに関しては、まずechos をifステートメントから移動できます。これらは同じであるためです。
良いことはif ($this->action->id != 'create')、コントローラーでチェックを行い、ビューに単純なブール値を与えることです:

if ($this->action->id != 'create') { // not sure if $this->action->id would remain the same, I don't know Yii
    $media = true;
    // or 
    // $page = 'media';
} else {
    $media = false;
    // or 
    // $page = 'vendor';
}

そして、コントローラーによって返された値に応じてパーシャルをレンダリングします。

于 2012-05-31T23:18:15.290 に答える
-3

私の意見では、「ベストプラクティス」はありません。チームで作業しない限り、またはスクリプトをオープン ソースとしてリリースしたい場合 (何十人もの人々がスクリプトを使用する必要がある場合) は、必要に応じて好きなようにフレームワークを使用してください。また、コードに関して他のユーザーと協力したとしても、そのための「神から与えられた」ルールはありません。

ビュー内で静的関数を使用することが「本当に許可されている」かどうかという質問よりも重要なことがたくさんあります。

于 2012-05-31T23:00:43.537 に答える