Задать вопрос
  • Что делать, если нужно получить часть данных сущности?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    1. "lazy loading" - в конструктор передаем обязательные к заполнению параметры, остальные данные подгружаем из базы по мере вызова методов т.е.
    public function getText(): string
    {
        if ($this->text === null) {
            $this->loadData();
        }
        return $this->text;
    }

    2. Использовать класс хэлпер, например, нужны breadcrumbs, создаем в хэлпере метод getBreadcrumbs в который передается массив Post объектов, метод извлекает данные из объектов и получает недостающие данные одним запросом сразу для всех постов.
    Ответ написан
    5 комментариев
  • Как сделать unit test метода в котором нужен заполненный массив?

    Maksclub
    @Maksclub Куратор тега PHP
    По-хорошему $this->solutions должно устанавливаться через конструктор, потому вам не составит труда заинжектить это состояние в тестируемый объект.

    Если у вас "пришлось", то можете заюзать некий хак, например через рефлексию/closure::bind установить состояние в тестируемый объект.

    Вот на скорую руку накидал (Разместите его в своем TestCase или прямо в тесте)
    protected function setPrivateProperty(object $object, string $propertyName, $value): void
    {
        $reflectionClass = new \ReflectionClass(get_class($object));
        $property = $reflectionClass->getProperty($propertyName);
        
        $property->setAccessible(true);
        $property->setValue($object, $value);
        $property->setAccessible(false);
    }


    ПРИМЕР
    Класс и метод, который нужно протестить и приватная переменная которого заполняется не через конструктор
    class System 
    {
        // Не важно, как оно будет заполнено, важно, 
        // что в методе мы проверяем некоторые значения  
        // и мы создадим ниже в тестах эти ситуации разными тест-кейсами
        private $solutions;
    
        public function checkRecords(): string
        {
            if (count($this->solutions) === 3) {
                return 'full';
            }
    
            if (count($this->solutions) === 6) {
                return 'overflow';
            }
    
            throw new IncorrectCountException('Incorrect solutions count.');
        }
    }


    Тесты
    public function testCheckRecordsFull(): void
        {
            // 3 элемента
            $data = [1, 2, 3];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $status = $system->checkRecords();
    
            $this->assertEquals('full', $status);
        }
    
        public function testCheckRecordsOverFlow(): void
        {
            // 6 элементов
            $data = [1, 2, 3, 4, 5, 6];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $status = $system->checkRecords();
    
            $this->assertEquals('overflow', $status);
        }
    
        public function testCheckRecordsIncorrectCOunt(): void
        {
            // сколько-то элементов, но не 3 и не 6
            $data = [1];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $this->expectException(IncorrectCountException::class);
            $system->checkRecords();
        }

    Код тестовый, просто отобразить принцип, возможно у вас в классе зависимости -- нужно будет сделать моки и т.д. Тут некоторые повторения можно вынести в setUp().
    Также хочу обратить внимание, что тесты построены по принципу ААА (Arrange, Act, Assert).
    Как итог, 3 ситуации, все протестированы, методу не важно, как заполнлась приватная переменная, но вся его логика протестирована. Все легко и просто.
    Ответ написан
    7 комментариев
  • Возможно ли получить уникальный идентификатор файла?

    2ord
    @2ord
    Полагаю, что если строить свою ИС (инф. сист.) поверх прослойки, работающей посредством FUSE, то все упростится.
    В своей нижележащей ФС можно назначать файлам UUID. Файл - это некий объект, с которым может быть ассоциирована такая служебная информация, как имя файла или URI, в общем виде, которые подвержены частым изменениям. Набор таких объектов хранить в некой СУБД (допустим, SQLite).
    При монтировании хранилища посредством FUSE в какую-нибудь директорию наружу будут видны как обычные файлы. При изменении имени файла меняется только служебная информация об объекте в хранилище. Хранилище может быть как локальное, так и удаленное. При удалении файла-документа в хранилище можно пометить объект как подлежащий утилизации или же просто удалению. При изменении версии файла-документа меняется содержимое объекта в хранилище. В служебной информации (meta data) можно также хранить хэш от содержимого.
    Ответ написан
    Комментировать
  • Есть ли будильник с поддержкой алгоритмов (своих условий)?

    @Raim
    Я пользуюсь Alarm Clock Xtreme Free. Помимо выставление нужного варианта работы будильника в течении недели, корректное подключение по Bluetooth (c динамикми или без). У меня слуховой апарат с bluetooth - будильник будет меня и немешает сигналом другим.
    Ответ написан
    Комментировать
  • Composer дает ошибку "Your requirements could not be resolved to an installable set of packages". Как разрешить?

    @krlljs Автор вопроса
    Нашел поднятую тему тут и тут, там и же и подсказка к разрешению:

    1. Проверить наличии расширения ext-xsl

    $ composer show --platform | grep ext-x
    $ composer show --platform | grep ext-xsl

    2. если в списки ext-xsl не будет, установи
    $ sudo apt-get install php5-xsl
    3. и добавляй зависимость в composer.json как require-dev, читай Require inline alias
    composer require --dev phpdocumentor/phpdocumentor dev-master

    4. чтоб ошибка больше не тревожила, следует так же добавлять зависимость на расширения, читай Platform packages
    composer require --dev ext-xsl "*"
    Ответ написан
    4 комментария
  • Как собственнику удержать клиентов при увольнении РОПа?

    Как так он может увести клиентов? Он сможет создать аналогичные предложения для клиентов? Что это за предложения такие? Вы чем 10 лет то занимались (в плане услуг и сервисов)?

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


    Если все же вы обычная торговая компания
    и за 10 лет не создали добавленной стоимости самой себе, ССЗБ

    Тут нужно думать как партизан:

    • выделить лояльных менеджеров и перевести на них ключевых клиентов... познакомить, ввести в курс дела (заодно пыль стряхнуть и что-нибудь продать) и честно предупредить о том, что ваш сотрудник уходит
    • сделать реструктуризацию (например сделать 2 отдела, 1й отдел — хантеры, которые только продают, 2й отдел только на поддержке, чтобы РОП остался в 1 отделе, а клиенты (не новые) были во втором) тут нужно подумать про ИТ-систему, но чисто бизнесово он (РОП) с этими клиентами не будет работать, во время этого нужно условие — затянуть РОП на работе некоторое время
    • не предлагать скидок и скидочных акций клиентам!
    • максимально гладко для РОП сделать переход (если вы собираетесь уволить, тк подточили под него все необходимое говно, то проблем не избежать)
    • вести уход максимально гласно — опубликовать везде про достижения РОП, сделать даже рассылку клиентам (только чтобы не было культа в «месседже»)
    • помочь РОП, да — помочь ему открыть бизнес или сделать его партнером (не в этой компании), а партнером на рынке... так многие крутые компании делают, тут большое поле для творчества, главное — друзья



    UPD: устроить в другую компанию на работу, поговорите с партнерами, может кому РОП нужен... выбейте условия даже получше своих....
    Причем это можно сделать настолько элегантно, что как-будто предложение настолько хорошо, что пора бы уйти...
    Ответ написан
    6 комментариев
  • Возможно ли сделать цельный фигурный блок с рабочим в нём overflow:hidden?

    Stalker_RED
    @Stalker_RED
    clip-path же.
    https://jsfiddle.net/t89nd42z/1 (тучку лучше в векторном редакторе нарисовать, не через path а при помощи дуг, например)
    Ответ написан
    8 комментариев
  • Как отлаживать javascript для ipad/iphone?

    crazy_leo
    @crazy_leo
    Frontend Developer
    Комментировать
  • Как провести подстановку в шаблон строки на js?

    lazalu68
    @lazalu68
    Salmon
    RegExp.template = /{(.*?)}/g;
    
    String.prototype.process = function(data) {
    	return this.replace(RegExp.template, (entry, word) => data[ word ]);
    }
    
    string = 'Меня зовут {name} и мой возраст {age}';
    user = {name: 'Lander', age: 33};
    
    string.process( user ); // 'Меня зовут Lander и мой возраст 33';
    Ответ написан
    2 комментария