ФорумПрограммированиеPHP для идиотовPHP и ООП → Нужен совет по реализации mvc-каркаса

Нужен совет по реализации mvc-каркаса

  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 19 июля 2010 г. 10:38, спустя 22 минуты 42 секунды

    Мне понравилась Мэтт Зандстра. PHP. Объекты, шаблоны и методики программирования, спартакус незнаю почему не рекламирует, вроде как тоже недавно купил себе такую )
    Work, buy, consume, die
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 19 июля 2010 г. 11:01, спустя 22 минуты 26 секунд

    Nyaah, вроде норм книжечка, спасибо за ссыль)
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 19 июля 2010 г. 11:40, спустя 39 минут 46 секунд

    Nyaah, нужно и мне почитать. Третье издание в 2010 году выпущено, с применением неймспейсов
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 19 июля 2010 г. 11:56, спустя 16 минут 6 секунд

    Nyaah, ага. Она ахуенна. А не рекламировал потому что не видел еще компа.
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 19 июля 2010 г. 12:50, спустя 54 минуты


    "Да ну нахрен это все, лучше буду использовать готовое, в том то и сила ООП", и сейчас другим советуете почитать и сказать "Ну нахрен, сила ООП в том что бы использовать готовое" :D


    Нет, нет, и еще раз нет. После прочтения половины книги про приемы ооп, паттерны, вы даже себе представить не можете как зачесались руки, написать что-то свое. Там кстати даже есть пару слов про каркасы, но я не об этом. Я после этой книги уже стал думать по другому, хотя там общие паттерны, там не будет про БД, про сервисные слои и так далее, это вы уже встретите у Фаулера.

    Просто, почему я пришел к использованию каркасов? Там написаны обыденные вещи, которые используется повсеместно, я посмотрел как это реализовано и мне все понравилось, лучше я пока не могу сделать. Но каркас, это каркас. Вы когда начнете писать приложение, вы будете думать о объектах и их взаимодействиях между собой(домен приложения или бизнес логика) и уж поверьте, вам точно не будет дела до работы с бд и до авторизации, а тем более там до сессий - это все уже должно быть готово.

    Я больше сосредотачиваюсь на самой бизнес-логике, а не на каркасе. Я пользуюсь каркасом, так как там есть базовый функционал, хотя и его не хватает. Я много чего дописываю. У того же Zend Framework нет работы с сервисными слоями, нет определенный понятий про модели, хотя это все, например, есть Doctrine. И уж извините, если я еще буду тратить время на каркас(самописный), а чужие готовые решения постоянно улучшаются и развиваются и получается, что мне о каркасе думать не надо. Мне надо сосредотачиваться на более сложных и интересных вещах.

    Хотя если есть время, я бы с удовольствием проектировал приложение с нуля и писал бы нуля. Ибо знаете фреймворки вас ограничивают, ставят вас в рамки.

    Примерно вот, что я хотел сказать про готовые решения. А так я очень люблю ООП. А про силу ООП, я скажу так, Zend Framework можно полностью подгибать под себя, он очень гибкий.

    Про книги то, что там примеры на C++ или Java не бойтесь, кстати я там не встретил множественное наследование. Поверьте, синтаксис уж очень похож на php, точнее наоборот. Там в книгах простые примеры и вы их поймете. Прочитайте обязательно, вы станете лучше.
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 19 июля 2010 г. 13:28, спустя 38 минут

    а есть где в псд почитать нахаляву?
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 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/, а по ссылке там такая. Фаулер, тут вроде, проверь
  • Flare

    Сообщения: 284 Репутация: N Группа: Кто попало

    Spritz 19 июля 2010 г. 16:56, спустя 2 часа 24 минуты 59 секунд


    Nyaah, вроде норм книжечка, спасибо за ссыль)

    Если кому будет полезна она в эл. виде, тогда ее можно почитать здесь
  • Flare

    Сообщения: 284 Репутация: N Группа: Кто попало

    Spritz 19 июля 2010 г. 17:02, спустя 5 минут 40 секунд

    а не чуть ошибся сорь… но по ссылке тоже неплохая есть часть в книге.
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 19 июля 2010 г. 22:04, спустя 5 часов 1 минуту 59 секунд

    Nyaah, да хороша книженция, я смотрел английский вариант, есть и другие хорошие, я думаю это более сильная http://www.ozon.ru/context/detail/id/2847621/ Но всё же нет таких, какие пишутся тем же Фаулером и т.п.
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 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;
    ?>
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 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(); как у тебя
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 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
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 20 июля 2010 г. 9:05, спустя 10 минут 50 секунд

    Абырвалг, т.е. ты предлагаешь для каждого компонента так писать ? Ахуеть расширяемость
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 20 июля 2010 г. 9:13, спустя 8 минут 4 секунды

    Абырвалг, т.е. ты предлагаешь для каждого компонента так писать ? Ахуеть расширяемость

    мозг включаем

    /** @return FM_Module_DB */
    fucntion getDB = return FM::get("db");
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!