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 совпадает с тем, что я делаю? Есть ли какие-либо другие способы сделать это?
Извините за плохой английский и глупые вопросы. Спасибо за ответы.
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, но в целом вы хотите написать как можно меньше кода. Избыточность - это признак того, что вы, вероятно, могли бы найти лучшее решение. Это общие советы (как и ваш вопрос), но, надеюсь, это поможет.
1) Логика представления должна быть простой и, при необходимости, в основном, если-то. В вашем примере любой из вариантов будет работать, но используйте логику в представлении. Однако, если бы вы проверяли вход в систему и перенаправляли, если не вошли в систему, это произошло бы в контроллере (или библиотеке).
2) Подумайте о моделях Codeigniter как о способах доступа к функциям базы данных - Создавать, извлекать, обновлять, Удалять. Мое (свободное) эмпирическое правило для моделей Codeigniter заключается в том, чтобы возвращать результаты обновления, удаления или вставляйте запросы или результирующий набор из запроса выборки. Затем в контроллере может выполняться любая применимая математика. Если это математическая операция, которая выполняется КАЖДЫЙ раз, подумайте о добавлении ее в библиотечную функцию. Смотрите ниже...
3) Расширение контроллера является правильным и наилучшим способом достижения этой цели.
*) Не добавляйте больше к своей тарелке, но также обязательно узнайте о Библиотеках Codeigniter. Например, в вашем контроллере вы можете загрузить свою библиотеку. Затем вы называете свой функция библиотеки с вашего контроллера. Функция библиотеки вызывает модель, которая извлекает результат вашей базы данных. Затем библиотечная функция выполняет математические вычисления для этой функции и возвращает результат контроллеру. У контроллера осталось мало кода, но многое сделано благодаря библиотеке и модели.
Пользовательская проверка должна быть в контроллере. Это должна быть первая функция, которую необходимо вызвать в конструкторе.
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();
}
}
?>
Изменение кнопки может быть реализовано в представлении путем проверки переменной сеанса в представлении и принятия соответствующих решений.