2

私はMVCを理解しようとしており、CIフレームワークを学んでいます。MVCに関するいくつかの質問とCIに関するいくつかの基本的な質問があります。

1)チュートリアルから読んだように、ビューはアプリケーションの視覚的な部分です。私の質問は次のとおりです。たとえば、[ログイン]ボタンがありますが、ユーザーがすでにログインしている場合、ボタンは[ログアウト]になります。そのログインチェックはどこにありますか?コントローラー上またはビュー上?つまり

   //this is view//

     <?php if($_SESSION('logged') == true):?>
     <a href="logout">Logout</a>
     <?php else: ?>
     <a href="login">login</a>        
     <?php endif; ?>

また

  //this is controller//

 if($_SESSION('logged') == true)
 $buttonVal = 'logout';
 else
 $buttonVal = 'login';

 //and we pass these value to view like
 $this->view->load('header',$someData);

 //this time view is like
 <a href="<?=$somedata['buttonVal']?>"><?=$somedata['buttonVal']?></a>

例としてこれらのコードを書くだけで、機能しないことがわかっています。これらは架空のコードですが、私が言っていることは理解できたと思います。ログインチェックはコントローラー上またはビュー上にある必要がありますか?

2)モデルにはデータに関するコードのみを含めてコントローラーに返す必要がありますか?たとえば、数学があります。データベースから2つの値を取得し、それらを乗算して表示します。モデルは増殖しますか、それともコントローラーがそれを行いますか?

ここでは、モデルを使用してデータをロードし、コントローラーで計算を行います。// model

   $db->query(....);
   $vars=$db->fetchAll();

   return $vars;

   //controller
   $multi = $vars[0] * $vars[1];
   $this-load->view('bla.php',$mutli);

ここでは、モデルを使用してデータをロードし、モデルに対しても計算を行います。コントローラーは、モデルからビューにデータを渡すだけです。

   //model

   $db->query(....);
   $vars=$db->fetchAll();
   $multi = $vars[0] * $vars[1];
   return $multi;

   //controller
   $multi = $this->model->multiply();
   $this-load->view('bla.php',$mutli);

つまり、モデルはデータベース作業のみを実行してデータをコントローラーに渡し、コントローラーは残りの作業を実行してビューをレンダリングに送信する必要がありますか?または、モデルは機能しますが、コントローラーはモデルを取得して表示に送信しますか?

3)これはcodeigniterに関するものです。すべてのページにヘッダーを配置する必要がありますが、使用しているページに応じてjavascripts、cssがあります。

        <?php foreach ($styles as $style): ?>
        <link id="stil" href="<?= base_url() ?>/css/<?= $style ?>.css" rel="stylesheet" type="text/css" />
        <?php endforeach; ?>

これはすべてのページにあるので、すべてのコントローラーで私は持っています

$data['styles'] = array('css1','css2');
$this->load->view('header', $headers);

メインコントローラーを作成してこれを書き込むことを考えています。他のすべてのコントローラーがこれを拡張します。CIwikiにMY_Controllerが表示されますが、このMY_Controllerは私が行っていることと同じですか?これを行う他の方法はありますか?

悪い英語とダミーの質問でごめんなさい。回答ありがとうございます。

4

3 に答える 3

5

これは絶対にビューロジックであり、私の意見では正しい方法です。

 <?php if($logged_in):?>
 <a href="logout">Logout</a>
 <?php else: ?>
 <a href="login">login</a>        
 <?php endif; ?>

の値は、$logged_inおそらくライブラリメソッドの呼び出しから取得されます。

<?php if ($this->auth->logged_in()): ?>

認証はグローバルにアクセスしたいものの1つであるため$this->auth->logged_in()、さまざまな理由でコントローラーまたはビューを呼び出している可能性があります(ただし、モデルではおそらくそうではありません)。

すべてのコントローラーで私は持っています

$data['styles'] = array('css1','css2');
$this->load->view('header', $headers);

はい、でコントローラークラスを拡張できますがMY_Controller、これをビュー/プレゼンテーション層に保持することをお勧めします。私は通常、マスターテンプレートを作成します。

<html>
<head><!-- load assets --></head>
<body id="my_page">
  <header />
  <?php $this->load->view($view); ?>
  <footer />
</body>
</html>

そして、テンプレートをロードするための小さなラッパークラスを作成します。

class Template {
  function load($view_file, $data) {
      $CI = &get_instance();
      $view = $CI->load->view($view_file, $data, TRUE);
      $CI->load->view('master', array('view' => $view));
  }
}

コントローラでの使用法:

$this->template->load('my_view', $some_data);

これにより、ヘッダー/フッターを繰り返しロードする必要がなくなります。私の意見では、ロードするCSSファイルやページタイトルなどのプレゼンテーションロジックは、可能な限りビューに属します。

モデルに関しては、再利用可能にする必要があります。そのため、モデルに必要なことを実行させ、データ操作(通常はデータベースのみ)に厳密に関連させてください。コントローラーにデータの処理方法を決定させます。

MVCとは関係ありませんが、一般的には、できるだけ少ないコードを記述したいと考えています。冗長性は、おそらくより良い解決策を見つけることができるという兆候です。これらは(あなたの質問のように)幅広いヒントですが、うまくいけばそれが役立つでしょう。

于 2012-05-13T14:28:14.810 に答える
-1

1)ビューロジックは単純で、必要に応じてほとんどの場合if-thenステートメントである必要があります。あなたの例では、どちらの場合も機能しますが、ビューのロジックを使用します。ただし、ログインを確認し、ログインしていない場合はリダイレクトする場合は、コントローラー(またはライブラリ)で発生します。

2)Codeigniterモデルは、データベース機能(作成、取得、更新、削除)にアクセスする方法と考えてください。私の(大まかな)経験則は、Codeigniterモデルの場合、更新、削除、挿入のクエリからの結果、またはフェッチクエリからの結果セットを返すことです。その後、適用可能な計算がコントローラーで発生する可能性があります。これが毎回発生する数学演算である場合は、ライブラリ関数に追加することを検討してください。下記参照...

3)コントローラーを拡張することは、これを達成するための適切で最良の方法です。

*)プレートにこれ以上追加するのではなく、Codeigniterライブラリについても必ず学んでください。たとえば、コントローラでライブラリをロードできます。次に、コントローラーからライブラリ関数を呼び出します。ライブラリ関数は、データベースの結果を取得するモデルを呼び出します。次に、ライブラリ関数はその関数に対して計算を実行し、結果をコントローラーに返します。コントローラにはほとんどコードが残されていませんが、ライブラリとモデルによって多くのことが達成されています。

于 2012-05-13T14:29:10.410 に答える
-2

ユーザーのログインチェックはコントローラーにある必要があります。これは、コンストラクターで呼び出す必要がある最初の関数である必要があります。

Below i have given the sample code which redirects the user to the login page if he is not logged in, hope this would give you some idea,

<?php

class Summary extends Controller {

    function Summary() {
        parent::Controller();
        $this->is_logged_in();
    }

    function is_logged_in() {
        $logged_in = $this->session->userdata('logged_in');
        if (!isset($logged_in) || $logged_in != true) {
            $url = base_url() . 'index.php';
            redirect($url);
            exit();
        }
    }

?>

ボタンの変更は、ビュー内のセッション変数をチェックし、それに応じて決定を行うことにより、ビューに実装できます。

このリンクを見てください

于 2012-05-13T14:27:38.553 に答える