PHP, понимание MVC и Codeigniter


Я пытаюсь понять 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 из базы данных, умножаем их и выводим на экран. Модель будет размножаться или это сделает контроллер?

Здесь мы загружаем данные с моделью и выполняем математику на контроллере: //модель

   $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);

Я думаю сделать главный контроллер, запишите это в нем, и все мои другие контроллеры расширят это, я вижу что-то MY_Controller на CI wiki, этот MY_Controller совпадает с тем, что я делаю? Есть ли какие-либо другие способы сделать это?

Извините за плохой английский и глупые вопросы. Спасибо за ответы.

Author: Malixxl, 2012-05-13

3 answers

Это абсолютно логичная логика, на мой взгляд, правильный способ сделать это:

 <?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()): ?>

Аутентификация - это одна из тех вещей, к которым вам потребуется глобальный доступ, поэтому вы можете вызывать $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, но в целом вы хотите написать как можно меньше кода. Избыточность - это признак того, что вы, вероятно, могли бы найти лучшее решение. Это общие советы (как и ваш вопрос), но, надеюсь, это поможет.

 5
Author: Wesley Murch, 2012-05-13 14:33:27

1) Логика представления должна быть простой и, при необходимости, в основном, если-то. В вашем примере любой из вариантов будет работать, но используйте логику в представлении. Однако, если бы вы проверяли вход в систему и перенаправляли, если не вошли в систему, это произошло бы в контроллере (или библиотеке).

2) Подумайте о моделях Codeigniter как о способах доступа к функциям базы данных - Создавать, извлекать, обновлять, Удалять. Мое (свободное) эмпирическое правило для моделей Codeigniter заключается в том, чтобы возвращать результаты обновления, удаления или вставляйте запросы или результирующий набор из запроса выборки. Затем в контроллере может выполняться любая применимая математика. Если это математическая операция, которая выполняется КАЖДЫЙ раз, подумайте о добавлении ее в библиотечную функцию. Смотрите ниже...

3) Расширение контроллера является правильным и наилучшим способом достижения этой цели.

*) Не добавляйте больше к своей тарелке, но также обязательно узнайте о Библиотеках Codeigniter. Например, в вашем контроллере вы можете загрузить свою библиотеку. Затем вы называете свой функция библиотеки с вашего контроллера. Функция библиотеки вызывает модель, которая извлекает результат вашей базы данных. Затем библиотечная функция выполняет математические вычисления для этой функции и возвращает результат контроллеру. У контроллера осталось мало кода, но многое сделано благодаря библиотеке и модели.

 -1
Author: csi, 2012-05-13 14:40:58

Пользовательская проверка должна быть в контроллере. Это должна быть первая функция, которую необходимо вызвать в конструкторе.

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();
        }
    }

?>

Изменение кнопки может быть реализовано в представлении путем проверки переменной сеанса в представлении и принятия соответствующих решений.

Пожалуйста, взгляните на эту ссылку

 -2
Author: oldrock, 2012-05-13 14:36:19