• MVC php на пальцах?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ох...

    Model View Controller. Да ну его, ему уже 45 лет (придумали в 79-ом году). Давайте лучше про Model View Adapter погокорим. это то что все используют в популярных фреймворках последние лет так 10 так точно.

    mvc-mvp-mvvm-6-638.jpg?cb=1375170002

    Вообще в этом всем важно не только то, что каждая буква обозначает, а как они друг с дружкой связаны.

    View - это не только HTML, но и вообще представление в целом, а так же логика его формирования. Шаблонизаторы, фильтры, различные функции/объекты помогаютщие нам сформировать view (например форматирование дат, сериализаторы и т.д.) В подавляющем большинстве случаев "представление" наших данных - это HTTP запросы и HTTP ответы. HTML - э то лишь часть HTTP ответа.

    Model - Это целый слой, который может быть представлен в виде кучи отдельных объектиков, структур и т.д. Его задача - делать дела и хранить/менять состояние системы. Тут легко запутаться потому что термин "модель" много чего значит. Воспринимайте его как "слой логики" а не конкретные объекты. И да - база данных и прочая чушь - это детали реализации этого слоя. "не важные штуки" словом. Туда же и ActiveRecord, ORM-ки всякие. Это деталь реализации и все остальные чуваки (view и controller) о них знать ничего не должны (хотя иногда могут в целях упрощения).

    Controller или адаптер. Это опять же не обязательно один объект. это может быть цепочка адаптеров (еще называют фронт-контроллером, middlewares и т.д.). Его задача весьма простая. Получаем представление данных на входе (HTTP запрос), определяем что надо делать, и просим модель что-то сделать (ни в коем случае не меняем ничего самостоятельно в контроллере, он только просит). Потом мы можем попросить модель вернуть нужный нам кусок состояния, и попросить View сформировать представление (HTTP ответ).

    Как-то так. В целом же это я сейчас описал "идеальный мир". Вся суть этого подхода - разделение логики презентационной и логики приложения. Зачем это надо? что бы было проще жить! Обычно UI приложения или способы взаимодействия с ним меняются почаще логики или как минимум в разные моменты времени. Адаптеры в этом случае служат промежуточным слоем, они ничего сами не делают, это "переводчики". Они просто переводят то, что сказано в запросе в язык понятный приложению и обратно.

    Но на начальной стадии можно слегка нарушать эти правила, делать толстые контроллеры и т.д. В этом случае бизнес логика будет потихоньку "вытекать" из модели. Это не хорошо, и на хоть сколько нибудь больших проектах может привести к проблемам. Потому важно находить баланс.
    Ответ написан
    Комментировать
  • Можно ли заменить матрицу с tn на ips на lenovo z580 с большим разрешением?

    @mbllllb
    Можно. Я заменил на своем Lenovo Z500 TN 1366x760 на IPS 1920x1080, хоть в линейке Z500 только с TN 1366x760. Просто смотрите в AIDA64 или подобном тип матрицы и с помощью спецификации подбираете заменяемую.
    Бывают случаи, когда производители экономят на шлейфе, который от видеокарты до матрицы - не хватает проводов (в ссылке ниже описано решение). Так же часто ставят шлейфы, которые не отдельными проводами, а лентой - тогда очень проблематично будет вставлять недостающие части.
    Совместимые матрицы: www.kv.by/content/vzaimozamenyaemost-sovremennykh-...
    Решение проблемы со шлейфом: www.gamedev.ru/pages/l/swap_matrix_fullhd
    Ответ написан
    6 комментариев
  • Как наследовать свойство PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Почитайте о инкапсуляции. И совет - не делайте внутри классов exit или инициализацию подключения к базе. Ленивая инициализация намного удобнее.

    class OCIConnect
    {
      private $link = null;
      public function __construct($user, $pass, $host) {
            // fixme: это не стоит делать в конструкторе, лучше использовать ленивую инициализацию.
            $this->link = oci_connect($user, $pass, $dbHost);
            if (!$this->connect) {
                $m = oci_error();
                throw new Exception(sprintf('Connection error: %s', $m['message']));
            }
        }
    
        public function exec($sql) 
        {
             // exec sql
        }
    }


    class Agent
    {
            /**
            * @var $connection
            **/
            private $connection;
    
    	function __construct(OCIConnect $connection)
    	{
                   $this->connection = $connection;
    	}
            public static function getData($sql,$bind = null) {
                    // do something
                   $this->connection->exec($sql);
            }
    }
    Ответ написан
    Комментировать
  • Как подключить adblock к своему сайту (не браузеру)?

    savostin
    @savostin
    Еще один программист
    недобросовестного бесплатного

    ну-ну
    Ответ написан
    1 комментарий
  • Какую выбраль cms для создания сайтов и интернет магазинов под заказ?

    trueClearThinker
    @trueClearThinker
    Продолжайте делать на ucoze, ваше творчество нужно людям!
    Ответ написан
    6 комментариев
  • Какую выбрать хорошую клавиатуру и мышь для программиста?

    Obi
    @Obi
    Я использую Filco Ninja на синих переключателях. Оооочень удобно печатать:
    www.diatec.co.jp/en/det.php?prod_c=777

    Зачем мышь программисту — не понятно. Я использую за 100 руб. и даже не возникало желания сменить. Мышкой пользуюсь 5% времени работы
    Ответ написан
    Комментировать