• Jest вывод в консоль теряет цвет?

    Seasle
    @Seasle Куратор тега JavaScript
    Потому что Jest-у по барабану. Исправлять так:
    console.log(util.formatWithOptions({ colors: true }, '%O', { a: 1, b: 2 }));

    Модуль util.
    Ответ написан
    2 комментария
  • Регулярное выражение для поиска подстроки в массиве?

    @Arik
    Несколько раз обойти, но зато поиск по регулярке реже
    var substringMatcher = function (strs) {
        return function findMatches(q, cb) {
            var matches, substrRegex;
            substrRegex = new RegExp(q, 'i');
            matches = strs.map(function (str) {
                return {pos: str.search(substrRegex), str: str};
            }).filter(function (a) {
                return a.pos > 0;
            }).sort(function (a, b) {
                return a.pos > b.pos;
            }).map(function (a) {
                return a.str;
            });
    
            cb(matches);
        };
    };
    Ответ написан
    1 комментарий
  • Регулярное выражение для поиска подстроки в массиве?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вариант 1:
    var mask = q.toLowerCase();
    var matches = 
      strs.filter(function(str) { 
        return str.toLowerCase().includes(mask); 
      }).sort(function(str1, str2) { 
        return str1.toLowerCase().indexOf(mask) - str2.toLowerCase().indexOf(mask); 
      });

    Вариант 2:
    var re = new RegExp(q, 'i');
    var matches = 
      strs.filter(function(str) { 
        return str.match(re); 
      }).sort(function(str1, str2) { 
        return str1.search(re) - str2.search(re); 
      });

    Минус варианта с регуляркой - можно ввести символы, при которых произойдёт ошибка, например 'ba['.
    Ответ написан
    Комментировать
  • Как Symfony инжектит Request в контроллер если он задан как параметр?

    myrkoxx
    @myrkoxx
    developer
    Вот инфомация о том как ето происходит и где:
    symfony.com/doc/current/components/http_kernel.htm...

    Вот сам компонент который етим занят:
    symfony.com/doc/current/create_framework/http_kern...

    Вот пример оф. пример вашего случая:
    symfony.com/doc/current/controller/argument_value_...

    Чесно говоря не думаю, что ето хорошая идея инжектить в метод контроллера таким способом. Как по мне лучше обьявить контроллер как сервис или еще лучше использовать другой подход к контроллерам. По сути обработчиком запроса может быть любой php callable. Можете написать свой клас с проинжекчеными сервисами которые вам нужны.

    Вот пример паттерна Action Domain Responder:
    https://speakerdeck.com/dunglas/adr-pattern-autowi...

    Вот сам бандл:
    https://github.com/dunglas/DunglasActionBundle

    Еще есть CommandBus:
    https://github.com/thephpleague/tactician-bundle

    P.S: извините за плохой руский
    Ответ написан
    Комментировать
  • Как Symfony инжектит Request в контроллер если он задан как параметр?

    miraage
    @miraage
    Старый прогер
    Отличная практика. А автоматический инжект делается за счет autowire.
    Ответ написан
    2 комментария
  • Typeahead/autocomplete снизить время ответа сервера до минимума?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    82 миллисекунды на никак не оптимизированном приложении на Symfony (с использованием Doctrine) на сервере с HDD.
    Вы явно что-то не так сконфигурировали. Используйте профайлер и ищите, где у вас такие большие проседания.
    Ответ написан
    6 комментариев
  • XDebug как пользуете?

    DevMan
    @DevMan
    не поверишь - по прямому назначению: дебаг с точками останова, дабы не мудохаться с print_r'ами/var_dump'ами и их удалением.
    бонусом - симпатичный var_dump, маяк о подавлении вывода ошибок, и еще несколько ништяков.
    Ответ написан
    4 комментария
  • DDD Agregate, Entity, Repository понятным языком?

    @miksir
    IT
    Entity - сущность бизнеса. То, что еще называют "моделью", хотя этот термин так засрали, что лучше и не вспоминать про него. С чем работает наша проблемная область? С Клиентом, с менеджером, с заказов, с товаром - это и будут сущности. Важный момент - у сущности есть уникальный идентификатор.

    Репозиторий - это коллекция сущностей, паттерн по управлению сущностями. Из репозитория мы их получаем, в репозиторий отправляем. Конкретная реализация репозитория на persistence уровне уже занимается сохранением и поиском сущностей в базах данных.

    С аггрегатом и просто и сложно. Когда мы проектируем нашу предментую область, мы можем выделить такие сущности, которые не должны использоваться в отрыве от какой-то другой. Например, есть сущности "конкурс" и "фото на конкурс". Последняя не может существовать без конкурса, не может использоваться без него. При этом, именно "конкурс" мы будем спрашивать - сколько фото пришло. Удаляя конкурс - нужно удалить все фото этого конкурса. В таких случаях, мы определяем сводные (aggregate) границы и выделяем главную сущность (aggregate root или сводный корень). Ссылаться "извне", т.е. из других сущностей, не входящий в аггрегат мы можем только на сводный корень. Запрашивать из репозитория можем только сводный корень. И т.п., там много ограничений. Основная идея тут - инкапсулировать взаимодействие связанных сущностей внутри сводных границ, упростив таким образом глобальные взаимодействия.
    Ответ написан
    4 комментария
  • В чем преимущества ValueObject и DTO?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Преимущество VO в том, что это значения, которые уже проверены на границы и тип. В вашем примере валидация происходит в геттере - это мягко говоря бессмысленно. Вот вам пример
    class UUID
    {
        /** @var string */
        private $value;
    
        /**
         * @param string $value
         */
        public function __construct(string $value)
        {
            if (!preg_match('/^[\da-f]{32}$/', $value)) {
                throw new \InvalidArgumentException(
                    sprintf('Argument "$value" must be correct UUID, actual value: "%s"', $value)
                );
            }
            
            $this->value = $value;
        }
    
        /**
         * @return string
         */
        public function getValue(): string
        {
            return $this->value;
        }
    }


    Дальше в коде вам достаточно делать type hinting на тип VO и все, значение будет корректным. От рефлексии, или runkit вы все равно защититься не сможете.

    -- --

    DTO - это штука, для удобного транспорта данных, между разными частями системы. Например у вас есть метод, который на вход принимает 20+ аргументов (например регистрация), вызывать такое кодло вероятно будет не удобно, но собрав dto вы можете его передать одним аргументом и рассчитывать на то, что данные переданы с правильными типами. Граничные же значения придется проверить, так как в задачу "транспорта" не входит контроль правильности данных между системами, что его используют.

    но вот внутри в тех частях логика которых фиксирована и не может меняться - вполне подходит массив ключ-значение

    Использование KV в контексте DTO/VO - дико хреновая практика, в очень редких кейсах ее использование оправдывает себя. Дело в том, что массив - это набор произвольных данных. Что бы писать надежный код - вам придется на каждом этапе делать проверку правильности этого массива. Что это за проверки?
    * все нужные ключи существуют
    * все значения по этим ключам правильных типов
    * массив не содержит левых данных

    как реализовать на php типизированую коллекцию типа как в СИ

    class MyTypedCollection implements \Countable, \IteratorAggregate, \ArrayAccess
    ...
    Ответ написан
    2 комментария
  • Зачем нужны миграции?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Зачем нужны миграции?

    Если по хорошему, то реальное их практическое применение только в том, что бы создать структуру таблиц, например, при установке какого-то бандла. Допустим, у Вас есть бандл "Новости", что бы Вам "руками" не лезть в базу и не запускать, пусть даже готовый SQL - миграции помогут Вам сделать это в автоматическом или полу-автоматическом режиме.

    а если постоянно таблицу с дынными надо поддерживать в актуальном состоянии? не проще ли держать sql-dump этой таблицы в git/svn ?
    На счёт SVN'а (по моему, он вымер как класс, даже Hg/Mercurial почти не осталось) не скажу, но мы так и делаем, храним дамп базы в репозитории, в некоторых случаях даже используем хуки Git'а, которые сверяют версии БД и при изменении - переписывают соотв. файл дампа и добавляют его к комиту.

    И основная проблема (*исключительно в нашей практике) даже не столько в самих миграциях как таковых, а в ущербности их возможностей, в большинстве случаев. Не редко, миграции покрывают лишь малую часть возможностей БД, обычно это: основные типы полей, внешние ключи и индексы. Таких вещей как: триггеры, хранимые процедуры/функции, виртуальные поля, View'шки, типы данных свойственные конкретной БД или просто "не популярные" типы данных, такие например, как GEOMETRY - очень часто, в миграциях не поддерживаются. Так же, как например, я пока не встречал механизмов миграций, которые бы могли нормально создавать такой элементарный тип, как ENUM в PostgreSQL, не говоря уже про более сложные, составные типы и т.д.

    Касательно Symfony, она как и многие другие фреймворки, не поддерживает даже такой типа данных как "ARRAY", вернее то, что в Symfony называется ARRAY - это по факту строка, с сериализованым массивом, а не массив в "чистом виде", который (как тип данных) есть например, в том же PostgreSQL. В виду чего, было бы удивительно ждать чего-то подобного от миграций.

    Ни в одном серьёзном/крупно проекте, я пока не видел настолько безумного администратора БД, который бы позволил модифицировать "живую" БД с помощью механизма миграций на уровне фреймворка. Только SQL-код, после предварительного анализа.

    На основании всего этого, мы для себя сделали вывод, что миграции отлично подходят для автоматизации создания примитивных болванок в БД, например, тех же "новостей", не более того.

    P.S. Я знаю, что для БД существуют специализированные механизмы/программы, для контроля БД, включая данные. Детально пока не разбирался, но подобная возможность ("Контроль версий БД") заявлена, например, в программе SQL Manager for PostgreSQL (для Windows).
    Ответ написан
  • Когда лучше macro а когда кастомная twig функция?

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

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

    UPD подведу итог, я бы рекомендовал
    1) использовать кастомные твиг функции, когда требуется какая то сложная логика или запрос данных из системы, но не рекомендовал бы ее для генерации html, просто потому что html в пхп не гуд. но в кастомной функции вы можете вызвать render другого шаблона, это норм, просто может ухудшить поиск верстки для фронтендеров (в случае инклюда для них все очевидно).
    2) макросы - для кучки небольших вещей которые используются часто и повсеместно (инпуты)
    3) инклюды для остальных кейсов, то есть когда данные уже есть и нужно их оформить в html
    Ответ написан
    2 комментария
  • Как спроектировать такое?

    VladimirZhid
    @VladimirZhid
    Нравится делать что-то интересное и полезное.
    а нужен ли фрейворк для таких задач?
    я вот счас только подумал сделать сервис и контроллер обычными js обьектами
    плюс применить какой-то простой шаблонизатор


    В таком случае советую React+Redux
    Очень доволен, после backbone и беглого взгляда на ember(Хороший, но реальный мастодонт)
    Если заинтересует в комментариях скину ссылочки на книжечки по реакту и редаксу... реально можно начать что-то писать через пару вечеров, понимание придет конечно позже... но старт относительно быстрый
    Ответ написан
    3 комментария
  • Как спроектировать такое?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    промисы. Они даже есть нативно в последних версиях топовых браузеров.
    Ответ написан
    2 комментария
  • Репозиторий для поиска в БД?

    turintomsk
    @turintomsk
    developer
    Стандартно для подобных случаев реализуется класс (модель) с полным перечнем параметров для конструктора (возможно с default параметрами) и метод, создающий этот объект.
    Модель:
    class Post {
        private $id;
        private $title;
        private $description;
        /** ... etc ... */
    
        public function __construct($id, $title, $description) {
            $this->id = $id;
            $this->title = $title;
            $this->description = $description;
        }
    
        public function getId() {
            return $this->id;
        }
        public function getTitle() {
            return $this->title;
        }
        public function getDescription() {
            return $this->description;
        }
    }

    Методы класса:
    class PostProvider {
        public function getPostById($id) {
            $response = /** ... Получаем данные ...  */;
            if (!$response) {
                throw new Exception('Not found.');
            }
            return $this->createPost($response);
        }
        public function getPostsByTitle($id) {
            $result = [];
            $responses = /** ... Получаем данные ...  */;
            foreach ($responses as $response) {
                $result[] = $this->createPost($response);
            }
            return $result;
        }
    
        /**
         * Метод возвращает объект Post по переданному массиву данных
         * @return Post
         */
        private function createPost(array $response){
            return new Post($response['id'], $response['title'], $response['description']);
        }
    }
    Ответ написан
    1 комментарий
  • "Сильные" книги по Symfony и архитектуре приложений?

    by25
    @by25
    Веб-разработчик
    1. Мэтт Зандстра "PHP: объекты, шаблоны и методики программирования" - Врубиться в ООП
    2. Эрик Фримэн и ко "Паттерны проектирования" (Head First) - Влюбиться в ООП
    3. Эрик Эванс "Предметно-ориентированное проектирование" - научиться проектировать сложные системы
    4. Крэг Ларман "Применение UML 2.0 и шаблонов проектирования" - про проектирование, глубокое понимание ООП
    Ответ написан
    Комментировать
  • Как запустить 2 сайта на локале?

    Gasoid
    @Gasoid
    <VirtualHost 127.0.0.1:80>
        ServerName  www.ez.dev
        ServerAlias ez.dev


    виртуалхост такой же должен быть, меняется только домен

    далее надо привязку имени с ip сделать,
    делается в файле etc/hosts

    127.0.0.1 ez.dev
    127.0.0.1 dt.dev
    Ответ написан
    1 комментарий
  • В чем идея методов getServiceLocatior/setServiceLocator?

    27cm
    @27cm
    TODO: Написать статус
    Если вопрос именно о ServiceLocator в Zend Framework, то эти методы предоставляют доступ к ServiceManager, который позволяет получать другие объекты (сервисы) приложения.

    Например, есть класс User, и мы хотим в нём обращаться к сервису для аутентификации. Это можно сделать так:
    namespace Application\Entity;
    
    use Zend\ServiceManager\ServiceLocatorAwareInterface;
    use Zend\ServiceManager\ServiceLocatorInterface;
    
    class User implements ServiceLocatorAwareInterface
    {
        protected $serviceLocator = null;
    
        public function __construct(ServiceLocatorInterface $serviceLocator) 
        {
            $this->setServiceLocator($serviceLocator);
        }
    
        public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
        {
            $this->serviceLocator = $serviceLocator;
            return $this;
        }
    
        public function getServiceLocator()
        {
            return $this->serviceLocator;
        }
    
        public function getAuthService()
        {
            return $this->getServiceLocator()->get('AuthService');
        }
    }


    Тоже самое можно написать короче, используя трейт:
    namespace Application\Entity;
    
    use Zend\ServiceManager\ServiceLocatorAwareInterface;
    use Zend\ServiceManager\ServiceLocatorInterface;
    use Zend\ServiceManager\ServiceLocatorAwareTrait;
    
    class User implements ServiceLocatorAwareInterface
    {
        use ServiceLocatorAwareTrait;
    
        public function __construct(ServiceLocatorInterface $serviceLocator) 
        {
            $this->setServiceLocator($serviceLocator);
        }
    
        public function getAuthService()
        {
            return $this->getServiceLocator()->get('AuthService');
        }
    }


    В качестве альтернативы можно использовать Dependency Injection.
    Ответ написан
    5 комментариев
  • Можно ли в mongo сделать вложеный запрос в другую таблицу?

    @s2dent
    Можете почитать здесь и здесь.
    Ответ написан
    Комментировать
  • Обьясние принцип аунтификации на сайте?

    EagleMoor
    @EagleMoor
    PHP Yii2 RESTful API Developer
    Да нет ни каких движух в этом направлении, все по старому, по логическому верному пути — все зависит от поставленных задач!

    Куки для обычных сайтов.

    OAuth для авторизации через соц сети, и то, после перенаправления на ваш портал и обработки что чел авторизуется через сторонний сервис вы ему те же печеньки присваиваете. Писать для своего портала OAuth провайдер — а оно вам надо? В топ плане будете ли вы предоставлять api для работы с данными пользователя?

    OpenID вроде уже ни кто не юзает, но он для авторизации через сторонний/ваш сайт без предоставления дополнительного API

    По поводу bearer — это для RESTful API сайтов. Когда пишется один backend для веба и мобильных приложений. Тогда веб как и мобила подписывает любые запросы "bearer {token}". Ну и да, не стоит путать "{token}" и md5(user+pass). Сначала вы делаете авторизацию пользователя по login+pass, затем выдаете ему уникальный token (по сути тот же session_id, но не храните статус пользователя). А как вы его уже генерируете на сервере, дело 3-е. Но да, не стоит md5(login + pass) делать =)
    Ответ написан
    4 комментария
  • Ресурсоемкая функция подвешивает браузер?

    dunmaksim
    @dunmaksim
    Технический писатель
    Ответ написан
    Комментировать