Метка «yii»

Yii2 зарелизился не так давно, и пока документация не полная, а рецепты в интернете не всегда верные, приходится через страдания разбираться в фрэймворке.

Проблема default scope в Yii2 существует уже больше года, еще с того времени, как Yii2 был в бета версии. Соответственно при поиске нас кидает на различные обсуждения, среди которых преобладает кривое решение. Этот пост должен решить данную проблему.
Читать полностью »

Создал контейнер для поднятия проектов на YII.
Для чего?
Для быстрого развертывания проектов, что бы не тратить время на подготовку базового контейнера.
Читать полностью »

Дорогие хабровчане, хотел бы на ваш суд выставить свою переработку/доработку известного фреймворка Codeigniter с попыткой адаптации модулей к фреймворку YII и «независимыми» модулями.

CI/YII Module Codeigniter v.1.0 (MCI v 1.0)

Расширенная версия Codeigniter для использования модульной системы (модульная архитектура). Архитектура адаптирована к фреймворку YII с минимальными «издержками». Версия первая, могут быть конечно баги, но всё таки её использую часто в своих проектах.
Читать полностью »

Вышел PHP-фреймворк Yii 1.1.15, исправляющий проблему безопасности, найденную в 1.1.14. Более ранние версии не затронуты. Если вы используете его, следует обновиться. 1.1.15 полностью совместим с 1.1.14.

Уязвимость затрагивает `CDetailView`. Если ваше приложение берёт значение `value` от пользователя, то атакующий имеет возможность выполнить произвольный PHP скрипт на вашем сервере. Мы не раскрываем подробностей сразу чтобы дать время обновиться. По нашим данным детали пока известны только основной команде разработчиков фреймворка.

Уязвимости присвоен номер CVE-2014-4672.

Забрать дистрибутив можно, как обычно, Читать полностью »

Постановка проблемы

Необходимо определить знание об адресе контроллера в одном слое системы. Это позволит быстро осуществлять поиск и безболезненно производить рефакторинг контроллеров и их адресов.

Реализовать проверку достаточности параметров для построения адреса. Это необходимо если параметры для адреса задаются в другом слое системы, например в представлении или клиентском скрипте.

Решение

Все адреса должны быть определены в контроллерах. При необходимости недостающие параметры можно заполнить в слое представления или клиентского скрипта.

Для удобной работы можно определить помощника — построитель адресов.

Исходный код построителя адреса

use CUrlManager;

class UrlBuilder {
    const PARAMETER_NAME_HASH = '#';

    /** @var CUrlManager */
    private $urlManager;
    /** @var string */
    private $route;
    /** @var array */
    private $params = array();
    /** @var array */
    private $required = array();

    public static function className() {
        return get_called_class();
    }

    /**
     * @param CUrlManager $urlManager
     */
    public function __construct(CUrlManager $urlManager) {
        $this->urlManager = $urlManager;
    }

    /**
     * @return CUrlManager
     */
    public function getUrlManager() {
        return $this->urlManager;
    }

    /**
     * @return string
     */
    public function getRoute() {
        return $this->route;
    }

    /**
     * @param string $route
     * @return $this
     */
    public function setRoute($route) {
        $this->route = $route;
        return $this;
    }

    /**
     * @return array
     */
    public function getParams() {
        return $this->params;
    }

    /**
     * @param array $params
     * @return $this
     */
    public function setParams($params) {
        $this->params = $params;
        return $this;
    }

    /**
     * @param string $name
     * @return mixed
     * @throws Exception
     */
    public function getParam($name) {
        if (!array_key_exists($name, $this->params)) {
            throw new Exception(sprintf('This param `%s` not exists'));
        }
        return $this->params[$name];
    }

    /**
     * @param string $name
     * @param mixed $value
     * @return $this
     */
    public function setParam($name, $value) {
        $this->params[$name] = $value;
        return $this;
    }

    /**
     * @return string
     * @throws Exception
     */
    public function getHash() {
        return $this->getParam(self::PARAMETER_NAME_HASH);
    }

    /**
     * @param string $value
     * @return $this
     */
    public function setHash($value) {
        $this->setParam(self::PARAMETER_NAME_HASH, $value);
        return $this;
    }

    /**
     * @return array
     */
    public function getRequired() {
        return $this->required;
    }

    /**
     * @param array $required
     * @return $this
     */
    public function setRequired($required) {
        $this->required = $required;
        return $this;
    }

    /**
     * @throws Exception
     * @return string
     */
    public function getUrl() {
        if ($this->hasRequiredParams()) {
            throw new Exception(sprintf('Required params `%s` not exists', implode(', ', $this->requiredParams())));
        }
        return $this->getUrlManager()->createUrl($this->route, $this->params);
    }

    /**
     * @return array
     */
    public function toArray() {
        return array(
            'route' => $this->route,
            'params' => $this->params,
            'required' => $this->required,
        );
    }

    /**
     * @return UrlBuilder
     */
    public function copy() {
        return clone $this;
    }

    protected function hasRequiredParams() {
        return (boolean)$this->requiredParams();
    }

    protected function requiredParams() {
        return array_diff($this->required, array_keys(array_filter($this->params)));
    }
}

Примеры использования

Определение знания об адресе в контроллере

Базовый абстрактный контроллер. Реализация метода создания обектов построителя адреса

class BaseController extends CController {

    public function createUrlBuilder($route, $params = array()) {
        $urlBuilder = new UrlBuilder($this->getUrlManager());
        $urlBuilder
            ->setRoute($route)
            ->setParams($params);
        return $urlBuilder;
    }

    public function getUrlManager() {
        $urlManager = $this->getApp()->getUrlManager();
        return $urlManager;
    }

    public function getApp() {
        return Yii::app();
    }
}

Читать полностью »

Доброго времени суток, дорогие читатели!

Хочу рассказать вам об интересной задаче, которая стала передо мной в рамках проекта и, естественно, о ее решении.

Исходные данные:
Стандартный набор LAMP (далее СС),
Yii framework (версия здесь не важна),
удаленный сервер (далее УС), на котором установлен демон Sphinx, searchd.
На УС создан пользователь с правами рута (но не сам рут).
На СС установлен модуль ssh2_mod для PHP.

Сразу оговорюсь, в этой статье я не буду расписывать особенности Sphinx, кому интересно, могут почитать официальный мануал sphinxsearch.com/docs/current.html.
Ограничусь только общей информацией.

Итак, Sphinx — поисковый демон, в моем случае работает с MySQL. Основная особенность — он индексирует базу по определенным запросам (описанным в конфиге сфинкса), и результат выборки сохраняет в свои файлы. Чтобы информация была актуальной (в MySQL возможно и добавление и редактирование записей), нужно запускать индексацию сфинкса. Тогда, он сделает повторную выборку и сохранит ее себе.

Задача:
Запускать индексацию сфинкса на УС.
Причина именно удаленного запуска состоит в том, что необходимо запускать команды по крону с конкретными параметрами, определяемыми в коде. Кроны запускаются с СС.
Т.е. на сервере запускается крон, метод которого выполняет индексацию на УС.
Читать полностью »

DevConf::PHP 2014 — уже на следующей неделе. PHPNG, Laravel, Yii, Асинхронный PHP — будь в курсе новинок разработки14 июня (суббота) 2014 — пройдет крупнейшая конференция по PHP, Python, Ruby, JavaScript, Android
62 доклада от авторов языков, баз данных и экспертов в WEB-разработке!

Впервые в России нам удалось собрать авторов MySQL, PostgreSQL, Percona Server, Sphinx, Tarantool в отдельном потоке DevConf::Storage — по сути это отдельная конференция по современным БД.

Поток PHP насыщен актуальными темами, который обязан знать каждый WEB-разработчик

  • PHPNG — новый движок для старого php
  • Laravel — Shawn McCool, Laravel core developer — самый «модный» фреймворк года!
  • Yii 2.0, обзор — что творится в мире PHP: тренды, инструменты и фреймворки
  • Архитектура AVITO.ru — самый крупная база объявлений, поглотившая конкурентов
  • Codeception — тестируем с человеческим лицом
  • Pinboard + pinba. Как организовать мониторинг сотни проектов
  • PHPCI: Система непрерывной интеграции для PHP-проектов
  • Асинхронный PHP — миф? Реальность!
  • MySQL + HandlerSocket = NoSQL

Читать полностью »

Префиксы и постфиксы в PHP (и CSS)

Ещё давно я взял практику использовать префиксы и постфиксы в PHP и в CSS. Особенно это актуально, когда что-то выходит за рамки локальной видимости и находится в глобальном пространстве, взять те же модели в Yii.

Префиксы и постфиксы несут основную задачу – сделать сущность максимально уникальной, причём настолько, чтобы её можно было без проблем найти любым текстовым редактором. На сегодняшний день IDE поддерживают отличную вещь – «Find Usages» (поиск использований), но это не всегда помогает, и об этом я напишу чуть ниже.

Именование в стиле Венгерской нотации мне не пришлось по душе. Такой подход мне не нравился ещё со времён C++ / Delphi – я считал его избыточном и не всегда понятным. Мне понравилась реализация БЭМ, но в полной мере я её тоже не использую. Я постарался вычленить и объединить наиболее понравившиеся мне методы, о них и расскажу.

Читать полностью »

Недавно я заметил, что на многих сайтах сделанных на Yii Framework есть одна и та же ошибка:
Если в каком нибудь поле ввода в атрибуте name добавить квадратные скобки и отправить форму, то можно получить сообщение об ошибке, типа:
htmlspecialchars() expects parameter 1 to be string, array given
Иногда даже можно увидеть исходный код PHP файлов, если разработчик забыл убрать константу YII_DEBUG.

Эта ошибка присутствует и на крупных проектах и даже на самом yiiframework.com/search/?q%5b%5d=
Читать полностью »

Меньше недели назад обновился Roadmap разработки любимого многими фрэймворка Yii2.

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

Вот некоторые, самые интересные из них (по сравнению с текущей альфой конечно)
Читать полностью »