Раунд 1 MVC.
Kohana
При объявлении собственного конструктора в контроллере, необходимо вызвать конструктор базового класса, так как Kohana основан на ООП и PHP 5 синтаксис этого вызова следующий:
parent::__construct()!
в отличии от
parent::Controller()
в Codeigniter.
В отличии от Codeigniter, Kohana требует что бы в наименование класса контроллера присутствовал постфикс «_Controller», не указав который, при обращении к контроллеру получаем сообщение об ошибке «Fatal error: Cannot redeclare class ».
На мой взгляд, это не совсем удобно, так как разработчик может иметь собственные правила именования классов, которые ни как не пересекаются с правилами Kohana. Однако это позволяет избежать конфликтов имен, в тех случаях, когда класс контроллера и, например, модели, называется одинаково.
Для обозначения методов, доступных только внутри контроллера (не доступных с сайта), Codeigniter предлагает использовать префикс «_» в названии метода.
Пример:
public function _some_action() - метод недоступный для вызова через URL сайта.
Kohana предлагает два варианта решения этой проблемы (один из которых наиболее интуитивен, по моему мнению), а именно:
можно объявить метод как private — такой метод недоступен через URL сайта
Пример:
private function some_action() - приватный метод контроллера.
как и в Codeigniter можно объявить закрытый метод с префиксом «_»
Пример:
public function _some_action()
— так же приватный метод.
Можно комбинировать два этих способа и объявить метод следующим образом:
private function _some_action()
Контроллер в Codeigniter может содержать еще две функции, аналога которых пока нет в Kohana:
_remap($method) — данная функция предназначена для локального роутинга, т.е. перенаправления на другие контроллеры приложения. В качестве параметра ей передается запрошенный в URL метод.
_output($out) — функции передается обработанное отображение, предназначенное для отсылки браузеру. Данная функция может быть использована для конечной обработки вывода.
Отображения (VIEW)
В обоих фреймворках отображения (или предстваления, или view) — это просто PHP сценарии, содержащие в основном HTML-код. Однако способ работы с отображениями кардинально отличается в этих фреймворках.
Codeigniter
Для загрузки файла отображения из контроллера используется вызов метода:
$this->load->view(«view_file»);
view_file — имя файла отображения без расширения «php».
В Codeigniter одновременно с загрузкой происходит и вывод отображения в браузер пользователя.
Для передачи параметров в представление, используется следующий вызов:
$this->load->view(«view_file»,$some_data);
где $some_data — ассоциативный массив содержащий параметры для отображения.
Пример:
$some_data['user_fname'] = 'Андрей';
$some_data['user_lname'] = 'Опейкин';
Если файл отображения будет содержать следующий код:
<html>
<body>
<h1>Привет $user_fname $user_lname!</h1>
</body>
</html>
То «отрендеренное» отображение (страничка, которую увидит пользователь) будет выглядеть так:
<html>
<body>
<h1>Привет Андрей Опейкин!</h1>
</body>
</html>
Кроме ассоциативного массива в качестве второго параметра метода, можно передавать объект, свойства которого, заменяют соответствующие переменные в отображении.
На мой взгляд недостатком такого подхода является то, что при загрузке отображения, автоматически происходит его отправка в браузер пользователя. Для перехвата вывода необходимо использывать метод контроллера _output() — описанный ранее, так же получить (а не вывести в браузер) полностью готовое отображение можно передав третий параметр в метод загрузки представления:
$page = $this->load->view(«view_file»,$some_data,TRUE); // содержимое присваивается переменной $page
Kohana
Для загрузки файлов отображений существует два способа:
Использование конструктора класса View
Пример:
$view = new View(«view_file»);
Вызов статичного метода (метод фабрики)
Пример:
$view = View::factory(«view_file»);
В обоих случаях «view_file» — имя файла отображения.
Использование любого из этих способов, приводит лишь к созданию объекта отображения, вывод содержимого отображения в браузер пользователя НЕ происходит.
Воспользуемся примером отображения, описанного выше.
Для передачи параметров в отображение используется объектный подход.
$view->user_fname = 'Андрей';
$view->user_lname = 'Опейкин';
Так же можно передать параметры методом set();
$view->set('user_fname','Андрей');
$view->set('user_lname','Опейкин');
Установка параметров отображения так же как и создание объекта отображения НЕ приводит к пересылке информации пользователю.
Для отправки вывода пользователю необходимо вызвать метод render() отображения
$view->render(TRUE);
На мой взгляд подход Konaha удобнее и практичнее.
Модели (Models)
В обоих фреймворках использование моделей НЕ является обязательным. При желании можно обойтись контроллерами и представлениями.
Kohana
Как и в случае с контроллерами, требует, чтобы класс модели имел определенный постфикс — «_Model».
Пример:
class User_Model extends model
.........
}
Для загрузки модели из контроллера, необходимо просто создать экземпляр класса модели:
$user = new User_model();
После этого можно обращаться ко всем методам и свойствам данного объекта.
Если в конструкторе модели вызывается родительский конструктор, т.е. конструктор имеет вид:
public function __construct(){
parent::_construct();
...............................
}
Автоматически загружается класс для работы с базой данных, доступный как
$this->db
Codeigniter
Для загрузки класса модели необходимо использовать следующий код:
$this->load->model(«model_name») ;
После этого к методам модели можно обращаться следующим образом:
$this->model_name->some_method();
Объект для работы с базой данных НЕ создается автоматически при загрузке модели, для того что бы объект все таки создался, необходимо передать значение TRUE в качестве третьего аргумента:
$this->load->model(«model_name»,'',TRUE) ;
Второй аргумент определяет псевдоним модели, по которым она будет доступна в контроллере.
Вся информация о фреймворке Kohana взята из соответствующей документации. Могут быть некоторые неточности, так как документация еще находится в процессе разработки и описывает далеко не все возможности и API этого фреймворка.
Привет!
Погружаешься в разработку ? Ищешь ментора ?
Поделюсь своими знаниями и опытом - https://opeykin.ru/mentor/
Добавил подсветку синтаксиса — стало лучше )))
Не хватает выводов. Сам я правда только Kohana использовал.
В Kohana тоже есть такая фича. В боекомплекте у вас есть Template_Controller и все что вам надо зделать — его унаследовать. Одним из плюсов Kohana есть возможность контроллерам наследовать друг друга. Когда я работал с CI (~год назад), то такого не было.
_remap() не может перенаправлять в другой контроллер. Т.к. перед вызовом _remap() уже сработал конструктор контроллера. Code Igniter не позволяет создавать несколько контроллеров в одно исполнение. Kohana тоже. Для Kohana есть библиотека Dispatch, которая позволяет работать через pull MVC, тоесть мы при запросе попадаем на View и от нее уже танцуем. Я думаю, что в CI тоже должна быть такая библиотека.
И в общем _remap() — для тех, кто еще не понял системы хуков в обоих фреймворках. Все что делает _remap() можна зделать через хук.
Не обязательно ваша модель должна наследовать библиотеку Model. У меня некоторые модели ничего не наследують.
Спасибо, интересная статья, Kohana на один шаг ближе стала к рускоязычному сообществу.
спасибо за замечания! статью поправлю!
Поправочка в CI
$this->load->view(‘имя_файла’, $data, true/false);
Третий необязательный аргумент позволяет изменить поведение функции так, чтобы она возвращала данные в виде строки, а не отправляла их в браузер. Это может оказаться полезным тогда, когда Вам надо каким-либо образом поработать с этими данными. Если аргумент указан как true (boolean), функция возвратит данные. Значением по умолчанию является false, и тогда данные попадают в браузер. Таким образом, помните, что указать аргумент необходимо, если нужен возврат, а не вывод данных:
Выводи результат в CI
$this->load->view(‘index’, array(‘name’=>’Максим’);
теперь тоже самое в Kohona
$view = View::factory(«index»);
$view->set(‘name’,’Максим’);
$view->render(TRUE)
Разве разница не очевидна? Место 3 строк 1 и в Kohona еще занимается лишняя переменная $view под объект.
Использую CI единственный соперник которого я вижу это ZF но до него еще очень далеко.
Big_Shark,
$this->load->view(’имя_файла’, $data, true/false) — не обратил внимания на данную возможность (честно сказать, она мне разу пока не понадобилась).
Спасибо!
Статью поправил!
Кстати в Kohana можно писать вот так..
$view = View::factory(‘testview’)->set(‘test’,’VAL1′)->set(‘test2′,’VAL2’)->render(TRUE);
Что вы заладили про _remap()
а конструктор для чего вам. Там же в доке сказано про это
сначала пишем parent::__construct()
а потом то что мы бы писали в ремапе
Автор, поправь подсветку кода! Все разъехалось жутко.
Подправил капельку!
Важное упущение в CI тоже можно писать __construct() и даже при наследовании Core Controller вместо parent::Controller() можно писать спокойно __construct() и я согласен c Big_Shark на сегодняшний день у CI в соперниках только ZF. До того как выбрать FrameWork проработал 4 года с Pure PHP(OOP-MVC) и 3 года в 6-ти компаниях, недавно выбрал CI — очень понравился гибкостью->легкостью->документацией
PS Раньше я был ярым поклонником чистых (pure) технологий и даже писал свой FrameWork — надоело писать одно и то же.
И еще одно упущение в CI тоже можно писать
private function myPrivate() {} — и метод будет закрыт и дирка недоступна, а еще можно даже protected методы писать — так что вес верхний топик о контроллерах вообще можешь убить =)
Спасибо, за замечание!
Статья писалась около года назад, тогда был CI — 1.6 и Kohana 2.0 (точно не припомню версии), с тех пор многое могло измениться =).
А по поводу соперников CI — посмотрите в сторону Yii, очень советую.