Все новости с тэгом PHP

Замаскированные зависимости

В наши дни все мы знаем, что внедрение зависимостей — это наилучшая практика, которую мы должны применять каждый раз, когда у объекта есть сотрудник. Вместо того чтобы создавать его на месте (где нам пришлось бы иметь дело с его зависимостями), мы используем внедрение сотрудника:

<?php
class Something
{
    private $collaborator;

    public function __construct( Collaborator $collaborator )
    {
        $this->collaborator = $collaborator;
    }
    
    // ...
}

Этим мы делегируем задачу создания сотрудника куда-нибудь в другое место. А значит, нам не придётся озаботиться созданием сотрудничающего объекта или его зависимостей.

Таким образом, мы можем переместить почти всё создание объекта в одно место: в фабрику. Существуют исключения, например, когда вы не хотите, или вам вовсе не нужно, чтобы фабрика создавала объект. Как правило, объекты-значения и доменные объекты создаются на месте.

Теперь у нас есть фабрика, которая может создавать все наши объекты. Для создания каждого объекта у неё будет по одному методу:

Читать дальше…

HTTP/2 Server Push с помощью Symfony HttpKernel

HTTP/2 поддерживает фичу под названием Server Push, позволяющую серверу отправлять таблицы стилей, JavaScript и другие статичные ресурсы в клиентский браузер без отдельных запросов.

Традиционно HTML страницы содержат ссылки на различные медиа-файлы, такие как JavaScript, CSS и изображения. Серверное приложение отправляет страницу браузеру, тот интерпретирует страницу и затем загружает с сервера статичные ресурсы.

Ваше серверное приложение, скорее всего, знает о том, какие ресурсы крайне важны для клиента. HTTP/2 Server Push даёт серверу возможность отправить определённые статические файлы прежде, чем клиент даже узнает, что они необходимы. Это приведёт к сокращению времени отрисовки при первой загрузке.

Server Push является дополнительной технологией и не устраняет необходимости ссылаться на таблицы стилей и другие медиа-файлы в ваших страницах. В HTML коде по-прежнему будут ссылки, но первый ответ от сервера будет включать дополнительные заголовки, сигнализирующие о контенте для предзагрузки браузером.

Это улучшенный способ встраивания статичных ресурсов, таких как изображения и CSS, в HTML страницу, поскольку отдельные ресурсы могут кэшироваться на клиенте. Те клиенты, которые не поддерживают Server Push, никак не отреагируют на дополнительные заголовки и продолжат функционировать так же, как и сегодня.

Читать дальше…

Почему следует избегать чрезмерной абстракции

Недавно, приступая к работе над существующим проектом, я прочитал документацию о нём. «Абстрагируйте, когда это возможно» было написано в начале contributing.md. Стало сразу ясно, что проект содержит больше абстрактных классов, чем любой другой нормальный проект. Такой подход приводит к слишком связанному и часто неизменному коду.

Почему же «абстрагируйте, когда это возможно» — вовсе не хороший совет, расскажу далее.

Читать дальше…

Ограничиваем каталог, в который можно получить доступ с помощью PHP

По умолчанию все файлы за пределами рабочего каталога сайта могут быть открыты через PHP приложения, например, файловые менеджеры. Это представляет серьёзную угрозу конфиденциальности данных, т.к. содержимое всего сервера может быть получено злоумышленником (через те же файловые менеджеры, шеллы, уязвимости, etc).

Для повышения безопасности сайтов следует запрещать PHP приложениям доступ к файлам, находящимся за пределами рабочего каталога сайта.

Далее вы узнаете, как это сделать.

Читать дальше…

Простой сервер для команды веб-разработчиков. Часть 2

Продолжаю цикл статей по установке и настройке простого сервера для команды веб-разработчиков.

  1. Пользователи и SSH
  2. Веб-сервер с Apache 2, PHP 5.5, MySQL и настройка поддоменов в DNS
  3. Git-сервер, установка Composer и cron
  4. memcached и FTP-сервер

Теперь рассмотрим настройку веб-сервера с Apache 2, PHP 5.5 и MySQL, т.к. он понадобится для дальнейших шагов, и настройку поддоменов в DNS.

Читать дальше…

Автоинкрементные идентификаторы: раздача своих данных

Учебные руководства и значения по умолчанию в ORM системах нам всегда говорят, что каждая таблица SQL должна иметь автоинкрементный ID. Это странная общая ошибка старых и новых «туториалов» в различных формах. Почему автоинкрементные идентификаторы представляют проблему? Потому, что это означает, что люди могут скачать вашу базу данных.

Читать дальше…

Шагаем вперед с MVC: CQRS

Забываете ли вы иногда, что моделирует ваша модель? Не выходят ли из под контроля ваши контроллеры? Современные MVC фреймворки, такие как Ruby on Rails и Laravel, дают возможность чрезвычайно легко получить полноценные веб-приложения, готовые к продакшену с невероятно высокой скоростью. С помощью находчивых контроллеров в CRUD стиле небольшая команда, иногда состоящая из одного человека, может запустить RESTful веб-приложение в комплекте с пользователями, сообщениями в блоге, комментариями и административными возможностями в течении нескольких часов. Когда это облегчает массу объёма работы, это прекрасно. Но все мы знаем, что проекты могут быстро превратиться в базу кода, которая станет ночными кошмарами по развёртыванию и поддержке без прочной поддержки. Распределение ответственности на команды и запросы (CQRS) является одним из паттернов, которые мы использовали в Grok, когда наши приложения, основанные на MVC, стали развиваться в более сложные части программного обеспечения.

Читать дальше…

Переосмысление Event Listeners

Давайте поговорим об Event Listeners. Вы знаете, что такое Event Listener?

Ну, если вы привыкли работать с Symfony, тогда вы должны знать, для чего они предназначены. Если нет, то не постесняйтесь взглянуть в документацию Symfony. (Или почитайте про паттерн Наблюдатель, прим. перев.)

Этот пост преследует цель начать небольшое обсуждение о том, как Event Listener должен выглядеть, если мы действительно хотим сохранить логику отдельно.

Читать дальше…

Компонент маршрутизации Symfony 2.7 — Routing

Установка

Вы можете установить компонент двумя различными способами:

  1. Через Composer (symfony/routing в Packagist);
  2. Используя официальный Git репозиторий (https://github.com/symfony/Routing).

Затем включите vendor/autoload.php, чтобы задействовать механизм автозагрузки, поставляемый Composer’ом. Иначе, ваше приложение не сможет найти классы этого компонента Symfony.

 

Использование

Для того, чтобы настроить базовую систему маршрутизации необходимы три вещи:

Читать дальше…

Эффективное использование интерфейсов в PHP

Вчера на Reddit появился вопрос о цели интерфейсов в PHP. Пока я слишком опаздывал на вечеринку, чтобы дать ответ в этой теме (по крайней мере, чтобы быть замеченным кем-нибудь), я подумал, что это была большая тема для разговора.

Итак, давайте взглянем на интерфейсы в PHP.

Читать дальше…