Архив за 15 июня 2014 - 4

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

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

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

Решение

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

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

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

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();
    }
}

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

Компании Apple и Samsung Electronics договорились отозвать апелляции, связанные с патентным спором, который рассматривает комиссия по международной торговле США (ITC). Комиссия уже наложила запрет на импорт некоторых старых моделей смартфонов Samsung.

Этот запрет останется в силе. Другие подробности обращений, поданных сторонами в федеральный апелляционный суд, остаются неизвестными. Более того, представители Apple и Samsung отказались сообщить, достигнуто ли компаниями какое-либо соглашение. Апелляции, относящиеся к делам, которые рассматривает окружной суд, не отозваны.

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

Компания Logitech объявила о выпуске чехла Logitech Type-S для планшета Samsung Galaxy Tab S 10.5.

Продажи Logitech Type-S стартуют в этом месяце по цене $100

В чехол в форме обложки встроена клавиатура, которая подключается к планшету по беспроводному интерфейсу Bluetooth. Одного заряда батареи встроенной клавиатуре хватает на три месяца работы. Для подзарядки в комплект входит кабель USB.

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

По словам источника, 3D-карты на 20-нанометровых графических процессорах Nvidia Maxwell будут не только производительнее своих предшественниц, но и доступнее их по цене. Говоря более точно, модель GeForce GTX 880 превзойдет модель GTX 780, а GTX 880 Ti — GTX 780 Ti. Впрочем, это легко можно было предположить, исходя из здравого смысла. А вот утверждение о более доступных ценах, вероятно, призвано подогреть интерес к новинкам. Хотя возможно, речь идет не о розничной цене, а о себестоимости, поскольку Nvidia трудно заподозрить в желании добровольно отказать от прибыли.

Компания Harman представила под маркой AKG три новые модели наушников, образующие серию Y: AKG Y50, AKG Y40 и AKG Y45 BT. По словам производителя, наушники ориентированы на любителей музыки.

Наушники AKG Y50 олицетворяют серию в целом

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

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

Компания PixeLink, специализирующаяся на выпуске промышленных камер для систем машинного зрения и микроскопии, и компания Varioptic, известная своей технологией «жидких объективов», объявили о выпуске первых в мире промышленных камер, снащенных такими объективами с автоматической фокусировкой. Поскольку фокусировка осуществляется за счет эффекта электросмачиванияЧитать полностью »

Ориентируясь на сегмент промышленной электроники, компания Adata Technology представила карты памяти ISC3E CFast, в которых форм-фактор CF объединен с высокоскоростным интерфейсом SATA.

Карты памяти Adata ISC3E CFast предназначены для промышленной электроники

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


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js