Форум → Программирование → PHP для идиотов → PHP и ООП → Нужен совет по реализации mvc-каркаса
Нужен совет по реализации mvc-каркаса
-
19 июля 2010 г. 10:38, спустя 22 минуты 42 секунды
Мне понравилась Мэтт Зандстра. PHP. Объекты, шаблоны и методики программирования, спартакус незнаю почему не рекламирует, вроде как тоже недавно купил себе такую )Work, buy, consume, die -
-
19 июля 2010 г. 11:40, спустя 39 минут 46 секунд
Nyaah, нужно и мне почитать. Третье издание в 2010 году выпущено, с применением неймспейсов -
19 июля 2010 г. 11:56, спустя 16 минут 6 секунд
Nyaah, ага. Она ахуенна. А не рекламировал потому что не видел еще компа. -
19 июля 2010 г. 12:50, спустя 54 минуты
"Да ну нахрен это все, лучше буду использовать готовое, в том то и сила ООП", и сейчас другим советуете почитать и сказать "Ну нахрен, сила ООП в том что бы использовать готовое" :D
Нет, нет, и еще раз нет. После прочтения половины книги про приемы ооп, паттерны, вы даже себе представить не можете как зачесались руки, написать что-то свое. Там кстати даже есть пару слов про каркасы, но я не об этом. Я после этой книги уже стал думать по другому, хотя там общие паттерны, там не будет про БД, про сервисные слои и так далее, это вы уже встретите у Фаулера.
Просто, почему я пришел к использованию каркасов? Там написаны обыденные вещи, которые используется повсеместно, я посмотрел как это реализовано и мне все понравилось, лучше я пока не могу сделать. Но каркас, это каркас. Вы когда начнете писать приложение, вы будете думать о объектах и их взаимодействиях между собой(домен приложения или бизнес логика) и уж поверьте, вам точно не будет дела до работы с бд и до авторизации, а тем более там до сессий - это все уже должно быть готово.
Я больше сосредотачиваюсь на самой бизнес-логике, а не на каркасе. Я пользуюсь каркасом, так как там есть базовый функционал, хотя и его не хватает. Я много чего дописываю. У того же Zend Framework нет работы с сервисными слоями, нет определенный понятий про модели, хотя это все, например, есть Doctrine. И уж извините, если я еще буду тратить время на каркас(самописный), а чужие готовые решения постоянно улучшаются и развиваются и получается, что мне о каркасе думать не надо. Мне надо сосредотачиваться на более сложных и интересных вещах.
Хотя если есть время, я бы с удовольствием проектировал приложение с нуля и писал бы нуля. Ибо знаете фреймворки вас ограничивают, ставят вас в рамки.
Примерно вот, что я хотел сказать про готовые решения. А так я очень люблю ООП. А про силу ООП, я скажу так, Zend Framework можно полностью подгибать под себя, он очень гибкий.
Про книги то, что там примеры на C++ или Java не бойтесь, кстати я там не встретил множественное наследование. Поверьте, синтаксис уж очень похож на php, точнее наоборот. Там в книгах простые примеры и вы их поймете. Прочитайте обязательно, вы станете лучше. -
-
19 июля 2010 г. 14:31, спустя 1 час 2 минуты 52 секунды
http://rapidshare.com/files/50075933/priemy_obektnoorientirovannogo_proektirovanija_patterny_proektirovanija.rar
Похоже вроде, просто у меня в бумажном варианте и обложка другая, а автора те же и название тоже. У меня такая - http://www.ozon.ru/context/detail/id/2457392/, а по ссылке там такая. Фаулер, тут вроде, проверь -
19 июля 2010 г. 16:56, спустя 2 часа 24 минуты 59 секунд
Nyaah, вроде норм книжечка, спасибо за ссыль)
Если кому будет полезна она в эл. виде, тогда ее можно почитать здесь -
19 июля 2010 г. 17:02, спустя 5 минут 40 секунд
а не чуть ошибся сорь… но по ссылке тоже неплохая есть часть в книге. -
19 июля 2010 г. 22:04, спустя 5 часов 1 минуту 59 секунд
Nyaah, да хороша книженция, я смотрел английский вариант, есть и другие хорошие, я думаю это более сильная http://www.ozon.ru/context/detail/id/2847621/ Но всё же нет таких, какие пишутся тем же Фаулером и т.п. -
20 июля 2010 г. 7:51, спустя 9 часов 47 минут 32 секунды
Вообщем каркас свой начал создавать, прошу оценить начало и высказать свое мнение.
Это только начало, поэтому поправьте меня если я не в ту сторону поперся, но как мне кажется это самый лучший вариант, зависимостей практически нет, например классы Request и View можно просто выкинуть и вместо них засунуть свои ничего не меняя. Комментов нет, но разобраться легко.
Базовый класс system/base.php:<?php
class Base
{
private static $app = null;
/**
*
*/
public static function CreateApplication()
{
if (self::$app === null)
self::$app = new Application;
else
throw new Exception('Application is already created');
}
/**
*
*/
public static function App()
{
if (self::$app === null)
throw new Exception('Application is not yet created');
return self::$app;
}
/**
*
*/
public static function AutoLoad($class)
{
require_once SYSPATH.strtolower($class).'.php';
}
/**
*
*/
public static function Exception($exception)
{
echo $exception->getMessage();
}
}
?>
класс system/Application.php:<?php
class Application
{
private $_config = null;
private $_request = null;
private $_db = null;
private $_view = null;
/**
*
*/
public function __get($name)
{
$method = 'get' . $name;
if (!method_exists($this, $method))
throw new Exception('Get method ' . $name . ' is undefined');
return $this->$method();
}
/**
*
*/
public function __set($name, $value)
{
$method = 'set' . $name;
if (!method_exists($this, $method))
throw new Exception('Set method ' . $name . ' is undefined');
$this->$method($value);
}
/**
*
*/
private function getConfig()
{
if ($this->_config === null)
$this->_config = require_once APPPATH.'config.php';
return $this->_config;
}
/**
*
*/
private function getRequest()
{
if ($this->_request === null)
$this->_request = new Request;
return $this->_request;
}
/**
*
*/
private function getDb()
{
if ($this->_db === null)
{
$lnk = mysql_connect(Base::App()->config['db']['host'],
Base::App()->config['db']['user'],
Base::App()->config['db']['password']) or exit('Can not connect to mysql');
mysql_select_db(Base::App()->config['db']['dbname'], $lnk) or exit('Can not select db');
mysql_query('SET NAMES ' . Base::App()->config['db']['encoding'], $lnk);
$this->_db = $lnk;
}
return $this->_db;
}
/**
*
*/
private function getView($template)
{
if ($this->_view === null)
$this->_view = new View($template);
return $this->_view;
}
}
?>
index.php для примера:<?php
error_reporting(E_ALL | E_STRICT);
define('APPPATH', realpath('application').DIRECTORY_SEPARATOR);
define('MODPATH', realpath('modules').DIRECTORY_SEPARATOR);
define('SYSPATH', realpath('system').DIRECTORY_SEPARATOR);
require_once SYSPATH.'Base.php';
spl_autoload_register(array('Base', 'AutoLoad'));
set_exception_handler(array('Base', 'Exception'));
Base::CreateApplication();
// тут просто для примера использования выводим юзер-агент и ip
echo Base::app()->request->user_agent;
echo Base::app()->request->ip;
?> -
20 июля 2010 г. 8:51, спустя 59 минут 50 секунд
А у меня такое , вот пример контроллера:
<?php
class IndexController extends Controller {
function _load () {
self::setDefaultAction('main');
self::addActionRegex('([0-9])', 'full');
self::addAction('all', 'all');
}
function actionMain () {
echo 'actionMain loaded';
}
function actionAll () {
self::$model->getAll();
}
function actionFull () {
echo 'actionFull loaded';
}
}Спустя 130 сек.wats, я сам нуб, но для получения инстанции лучше сделать так FW::get('db'); , а не FW::getDB(); как у тебя -
20 июля 2010 г. 8:54, спустя 3 минуты 3 секунды
Base - это что такое? Типа контейнер? Если да, то зачем там autoload и exception handler? Почему класс Application захардкоден?
Почему ты используешь такие низкоуровневые ф-ции типа mysql_query и такую припизденную обработку ошибок (or die(mysql_error()))?
Спустя 48 сек.wats, я сам нуб, но для получения инстанции лучше сделать так FW::get('db'); , а не FW::getDB(); как у тебя
фигли? Во втором случае можно организовать автодополнение в IDE -
20 июля 2010 г. 9:05, спустя 10 минут 50 секунд
Абырвалг, т.е. ты предлагаешь для каждого компонента так писать ? Ахуеть расширяемость -
20 июля 2010 г. 9:13, спустя 8 минут 4 секунды
Абырвалг, т.е. ты предлагаешь для каждого компонента так писать ? Ахуеть расширяемость
мозг включаем
/** @return FM_Module_DB */
fucntion getDB = return FM::get("db");Сапожник без сапог
Пожалуйста, авторизуйтесь, чтобы написать комментарий!