• Плавная подгрузка контента при скроллинге?

    @tyzberd
    https://daneden.github.io/animate.css/

    +

    $(document).ready(function () {
        (function () {
            var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
                window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
            window.requestAnimationFrame = requestAnimationFrame;
        })();
        var windowHeight = $(window).height();
        function animate(timelineBlock, time) {
            timelineBlock.each(function () {
                if ($(this).offset().top <= $(window).scrollTop() + windowHeight * time && $(this).hasClass("invisible")) {
                    $(this).removeClass("invisible").addClass("animated slideInUp")
                }
            });
        }
    
        var timelineBlock = $('.js-timeline-animate'), time = 1;
        $(window).on('scroll', function () {
            requestAnimationFrame ? requestAnimationFrame(function () {
                animate(timelineBlock, time)
            }) : setTimeout(function () {
                animate(timelineBlock, time)
            }, 100)
        })
    });


    https://codepen.io/tyzberd/pen/XGerLm
    Ответ написан
    Комментировать
  • Как получить доступ к добавленному мной блоку конфигурации?

    Maksclub
    @Maksclub
    maksfedorov.ru
    В Extension бандла получите из конфига значение и положите в контейнер (он доступен вторым параметром в методе load()):
    $container->setParameter('your.service.name.mapping', $config['menuItems']['mapping']);

    И же в контроллер/любой другой сервис пробрасывайте в конструктор эти значения:
    arguments:
     - 'your.service.name.mapping'
    Ответ написан
    4 комментария
  • Как создать подобный слайдер?

    aliencash
    @aliencash
    Партизан
    Вот чего удалось добиться настройками border-radius. Не совсем точное соответствие, но все же. Светло-зеленый цвет - это генерируемая фигура border-radius, розовый - оригинал, болотный зеленый - наложение.
    https://codepen.io/aliencash/pen/pGLqdL

    Идея отсюда https://habr.com/ru/company/ruvds/blog/426731/
    Ответ написан
    Комментировать
  • Как создать подобный слайдер?

    alex_shevch
    @alex_shevch
    Frontend Developer
    Вот интересная тулза для создания разных форм с помощью border-radius - https://9elements.github.io/fancy-border-radius/fu...
    Ответ написан
    Комментировать
  • Как сделать связь одного поля таблицы с несколькими сущьностями (entity)?

    @Flying
    Вы уже используете DiscriminatorMap который является правильным решением в данной задаче. Вам ничто не мешает теперь иметь в наследуемых классах отдельные свойства содержащие связи с конкретными entities, специфичными для каждого конкретного типа пункта меню. Вы также вполне можете объявить getEntity() / setEntity() в классе MenuItem абстрактными, а в дочерних классах реализовывать их. Конечно типы на уровне языка вам будет не задать, но никто не будет вам мешать использовать PHPDoc для создания type hints.
    Ответ написан
    1 комментарий
  • Чистый код в php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Тот редкий случай, когда автор вопроса куда лучше разобрался в проблеме, чем те, кто пытается отвечать.

    Да, всё верно, Симфони приучает к правильной структуре кода. Так что самым лучшим вариантом будет устроиться на работу в компанию, где используется Симфони - и учиться на практике.

    Если же решать проблему с нуля - то есть из теории - то чтением книжек отцов-основателей - Мартина, Фаулера - вот это вот всё. Новичкам редко подходит, так что я бы рекомендовал совмещать теорию с практикой.
    Ответ написан
    4 комментария
  • Symfony 4.2, какая производительность autowiring'а через @required аннотацию?

    @Flying
    Поскольку контейнер в Symfony компилируемый - на runtime производительность это не влияет никак. Если хотите проверить - загляните в то во что превращается код создания вашего сервиса в контейнере, всё это лежит в var/cache, там будет обычный setLogger($this->get('logger')) или что-нибудь типа этого.
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

    * Кэш должен очищаться по двум условиям (не по одному из, а именно по двум):
    - Время.
    - Протухание по бизнес логике.
    Разрешается по только времени в безвыходных ситуациях, но тогда время - короткий период.
    - При расчете ключей кэша должна использоваться переменная из конфигурации приложения (на случай обновлений кэш сбрасывается кодом, а не флашем кэш-сервера). В случае использования множества серверов - это очень удобный и гибкий инструмент при диплое.

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как хранить бизнес-логику чтобы модели не превратились в монстров из десятков тысяч строк?

    Тут не совсем модели. Entity - это просто объект данных, умеет хранить их в себе и бросать исключения, если не правильные данные вставляете, все. Repository - умеет работать со своим Entity И БД.

    БЛ находится в классах сервисах.

    Читал про Command Bus где, если правильно понял, на каждое действие в системе – свой класс?

    Вообще под каждое дествие - не обязательно, тут нужно руководствоваться здравым смыслом.

    Как их организуете (их тогда будут сотни)?

    Иерархически. Путь к классу должен быть "понимаем".

    Есть ли смысл выносить каждую доменную модель в модуль/микросервис, хранить всю связанную логику где-то там внутри, а с остальными общаться по внешнему API?

    Только в тому случае, если вы уже делали такие же проекты и в точности знаете максимально точно границы каждого домена. Иначе - не стоит. Делайте монолитную систему, а разделение на микросервисы - только по факту необходимости.

    За ответы в клиентскую часть – отдельный сервис-фронтенд?

    Если в "сервис" вы вкладываете понятие простого класса, умеющего форматировать ответы вашего проекта - мысль здравая.
    Если ответы будут асинхронными (от сервера к другому) - имеет смысл выностить в отдельный клиентский класс.

    Каков оверхед?

    Ничтожный.

    Используют ли такое на практике?

    Да

    Какие подводные камни?

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

    Как не превратить кидание/получение событий типа PostBeforeEdit/PostBeforeEditHandler в "callback hell"?

    Если есть возможность отказаться от событийной модели - часто лучше отказаться.
    Листнеры доктрины конечно штука мощная, но работает не всегда очевидно.

    Функционал "PostBeforeEdit/PostBeforeEditHandler" часто дешевле и проще вынести в сервис, но опять же руководствуйтесь здравым смыслом.

    ACL Где храните указанную логику?

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

    Какие структуры для описанного выше – best practice?

    Если есть возможность привести к одноуровневому виду - сделайте. Если с точки зрения бизнеса может потребоваться иерархическая (не фиксированной вложенности) ACL - до последнего убеждайте, что это плохая идея, не повторяйте чужих ошибок.

    В моём понимании это выглядит как куча трёхмерных кубов доступа "crud – group – entity – field", как это сделать более плоским пока только одна идея – делать кучу таблиц many-to-many.

    Гибкая настройка вплоть до каждого поля 90% что не нужна. Если можно свести к понятию скопов прав - сделайте это.
    Структуру можно предлагать только зная ваш проект.

    Версионирование. Как вы версионируете подобные проекты?

    Semver.

    А если нужна "N-1" рабочая версия на продакшене?

    Значит на прод попадает ваша версия с тегом "N-1"))

    Есть ли смысл разделять версии в рамках единой кодовой базы проекта и как (неймспейсы, конфиг, модуль, что-то ещё)?

    Храните яйца в отдельных корзинках. Если модуль развивается полностью отдельно и может быть вынесен как зависимость проекта в vendor - делайте.

    И, самое главное – как всё это совместить?

    • РУКОВОДСТВУЙТЕСЬ ЗДРАВЫМ СМЫСЛОМ
    • Принимаете жесткие соглашения по правилам написания кода, например такие
    • Постарайтесь убедить бизнес в том, что без покрытия кода автотестами будет дороже, нестабильней и дольше. + Пишите тесты. Если объем тестов в 4 раза больше кода, который они тестируют - это норм. У меня бывали случаи, когда для критичного функционала тестов было в ~16 раз больше, чем кода.
    • Жесткие, обязательные кодревью.
    • Если задача крупная - декомпозируйте ее.
    • Технический долг - возвращайте обязательно И как можно скорее.
    • Перед тем как писать код для работы с внешним сервисом - имеет смысл написать его эмулятор.
    • Спешите только в случае серьезных проблем на проде)). Фичи "на вчера" отличаются от фич "на потом" только приоритетом выполнения, более ничем.
    Ответ написан
    6 комментариев
  • Как сделать такой Range slider?

    @Flying
    Посмотрите на noUiSlider, он (как следует из названия) весьма хорошо кастомизируется, обладает богатым функционалом и не имеет ненужных зависимостей.
    Ответ написан
    Комментировать
  • Как сделать на странице динамическую подгрузку, статического контента?

    GTRxShock
    @GTRxShock
    SA
    Но я использую Симфони, и она вроде как по ресурсоемкости "тяжелее" остальных собратьев

    спорное заявление, тем более в сторону 4 версии, так как там используется флекс подход с надстройкой над микро ядром

    Но большая часть из них, 3 из 4, статична

    то что статично разумно отдавать сразу при рендере страницы

    Получается, что ради подгрузки этих статичных блоков каждый раз будет запускаться 3-4 процесса с запуском Симфони на сервере

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

    причем ajax запросы возвращают данные зачастую в json формате, без оверхеда + можно закешировать на серверном уровне

    p.s. если упретесь в железо от прибыльного трафика, это добрый знак, значит денег хватит на новое или рефакторинг :D
    Ответ написан
    3 комментария
  • Как сделать на странице динамическую подгрузку, статического контента?

    voronkovich
    @voronkovich
    Если контент статический, вы можете просто вставить его HTML-код в шаблон. В иных случаях лучше использовать HMVC: How to Embed Controllers in a Template

    В демо приложении есть два примера, иллюстрирующих вставку блоков с контентом: https://github.com/symfony/demo/blob/bbe5180a8c3b6... и https://github.com/symfony/demo/blob/bbe5180a8c3b6...

    В последнем примере также используется ESI для кэширования блока.

    Также, если блок статический, то для него можно не создавать отдельный контроллер, а использовать TemplateController: How to Render a Template without a custom Controller
    Ответ написан
    1 комментарий
  • Где и когда стоит использовать partial объекты doctrine?

    voronkovich
    @voronkovich
    На мой взгляд их лучше не использовать вообще.

    1. Эта идея была взята из Hibernate. Но, Java позволяет в последствии сделать дозагрузку данных которые не были загружены изначально. Т.е. использование partial objects не может привести к ошибке. В PHP у объектов нет API аналогичного Java. У меня есть подозрение, что именно поэтому partial objects будут убраны из Doctrine 3, как это стало с поддержой операций detach/merge.

    2. Реализация partial objects в Doctrine противоречит принципу "Модель всегда должна быть валидна"

    Кстати, вы забыли про вариант с использование легковесного DTO (см. паттерн Flyweight), вместо массивов. См. https://www.doctrine-project.org/projects/doctrine...

    Когда можно использовать массивы?

    Массивы легко сериализуются, например, с ними можно быстро сделать API:
    public function api(EntityManagerInterface $entityManager): Response
    {
        $posts = $entityManager->createQuery('SELECT p FROM App\Entity\Post p')->getArrayResult();
    
        return new JsonResponse($posts);
    }
    Ответ написан
    5 комментариев
  • Как реализовать отзывы для нескольких сущностей?

    padlyuck
    @padlyuck
    https://www.doctrine-project.org/projects/doctrine... или https://www.doctrine-project.org/projects/doctrine... для организации всех комментариев в одной таблице. Судя по документации вам придется сделать класс родительского комментария и 3 класса конкретных сущностей комментариев относительно того к чему они привязаны. Да и разный функционал будет проще потом разносить, а не мешать в кучу коней с людЯми
    Ответ написан
    1 комментарий
  • Как правильнее проверять CSRF токены?

    voronkovich
    @voronkovich
    Оба способа правильные. Просто второй более устойчив к CSRF-атакам. Например, компонет форм по умолчанию использует имя класса формы для поля "intention" ("ключевое слово", если использовать ваше определение): https://github.com/symfony/form/blob/a0386553fabb5...

    С другой стороны, есть мнение, что использование различных токенов, не делает приложение более безопасным. См. https://github.com/symfony/symfony/issues/18115

    Лично я использую первый вариант т.е. один токен на все приложение.
    Ответ написан
    1 комментарий
  • Научился создавать сайты, но не обладаю "дизайнерским взглядом", как его получить?

    Sanes
    @Sanes
    Копипастить идеи никто не запрещает. Разуметтся не до фанатизма. Сдержанное деловое оформление сделать проще простого. Отдельно заказывать фото и баннеры, от них зависит 90% восприятия.
    Придерживайтесь простого правила, не более трёх основных цветов.
    Обычно фон, primary, secondary.
    В номом UIKIT 3 по этому пути пошли. В отсутствии вкуса их обвинить точно нельзя.
    Ответ написан
    Комментировать
  • Научился создавать сайты, но не обладаю "дизайнерским взглядом", как его получить?

    Sanasol
    @Sanasol Куратор тега Веб-разработка
    нельзя просто так взять и загуглить ошибку
    Научился создавать сайты на основе чьих-то PSD макетов,но когда начинаю создавать сайт с нуля "из головы" выходит довольно "уродливое" творение.

    вам шашечки или ехать?)
    верстать/программировать и разрабатывать дизайн две совсем разные сферы.
    В одной надо кодить, в другой рисовать.

    Собрать интерфейс админки из фреймворка css например можно и без дизайна, но опять же надо руку набить и понимать что к чему, а не лепить кашу малашу. Только опыт наработанный в этом поможет.
    Ответ написан
    Комментировать
  • Слеш в роуте Symfony?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    В 3.4
    @Route("/{slug}/", name="my_page", requirements={"slug"=".+?"})

    либо
    @Route("/{slug}/", name="my_page")

    В 4.1 будет выдаваться желаемый результат
    Ответ написан
    Комментировать
  • Куда складывать свои модули в Symfony4?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    В vendor свою либу. Но пока ее пишешь можно как подпапку в проекте .
    Ответ написан
    1 комментарий