Задать вопрос
  • Как верстать изогнутые секции?

    RAX7
    @RAX7
    SVG + 2 маски, одна пропорционально растягивается, другая непропорционально. Отрицательным margin загнать секции одна на другую.
    Ответ написан
    6 комментариев
  • Стоит ли хранить директорию .idea на github?

    mmmaaak
    @mmmaaak
    не все пишут в идее, так что настройки линтеров и тд могут не работать у других разработчиков, лучше хранить настройки линтеров в конфигурационных файлах в проекте и использовать всякие editorconfig, и хранить их в корне репозитория, имхо
    Ответ написан
    2 комментария
  • Как продвигать своё расширение для Chrome?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    на полезность
    Ответ написан
    Комментировать
  • Как понять что ты знаешь javascript и готов приступить к изучению фреймворков?

    @dimoff66
    Кратко о себе: Я есть
    Один мальчик не зная javascriipt-а приступил к фреймворкам, нашел себе работу, дорос до тимлида, создал свои курсы, так и не поняв, что он не знал javascript и совершенно не был готов к изучению фреймворка. А время то не вернешь.

    PS Если говорить серьезно, то доказательство существования пудинга в его вкусе. Если пишете работающий код на js - значит знаете на уровне, достаточном для фреймворка. Процесс познания почти бесконечен. Поэтому какой-то точки, где можете сказать "Да, теперь я знаю" не существует. просто получайте удовольствие от изучения и программирования и не парьтесь знаете вы что-то или нет.
    Ответ написан
    Комментировать
  • Как посмотреть схематически структуру проекта?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Гуглите "PHP profiler" и выбираете любой понравившийся, так как почти все умеют строить дерево вызовов
    Какой взять профайлер для PHP?

    для расширения кругозора можно посмотреть коротенький доклад https://www.youtube.com/watch?v=vF29LanRQv4
    Ответ написан
    1 комментарий
  • Попинайте 2. Удалось ли исправить устаревший код, который забраковал работодатель?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    По сравнению с прошлым авриантом - небо и земля.
    В целом этот код лучше, чем 99.9% того что пишут на тостере. No kidding.

    Улучшить можно только по мелочи.
    as Place в неймспесах лишнее. as нужно если ты другое имя даешь

    Рекомендую перейти с bindParam на передачу массива в execute.
    Так получится убрать дублирование кода в getPlaces(). Добавляя условие в запрос тут же добавляешь жлемент в массив. потом тупо скармливаешь этот массив execute(). Пример можно посмотреть здесь

    если имена полей совпадают с имнами свойств класса, то вместо
    while ($row = $stmt->fetch()) {
                $place = new Place();
                $place->setPlaceID($row["placeID"]);
                $place->setTypeID($row["typeID"]);
                $place->setName($row["name"]);
                $place->setTansliterated($row["tansliterated"]);
                $place->setCountryID($row["countryID"]);
                $place->setDescription($row["description"]);
                $places[] = $place;
    }

    можно написать
    $places = $stmt->fetchAll(PDO::FETCH_CLASS, 'Place');

    Но вообще это не очень гибко и лучше уже начинать мигрировать в сторону ORM

    кстати, по ридми
    в https://phptherightway.com/ написано Use the Current Stable Version (7.4)
    PSR-4 это не стандарт написания кода

    плюс обработку ошибок следует сделать конфигурируемой, в зависимости от окружения.
    при разработке удобнее видеть ошибки на экране
    плюс вообще конфиг надо сделать зависящий от окружения.
    дома у тебя пароль от базы один, а на боевом сервере другой.
    конфиг должен подкключаться в зависимости от окружения
    Ответ написан
    34 комментария
  • В чем разница между dependency injection и методом, который возвращает тип класса?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В чем разница между поехать в отпуск и футболом?
    И в том и в другом случае мы будем носить обувь.
    Вот пример: в холодильник можно поставить пиво, а по карточке можно снять деньги в банкомате.

    Ты, во-первых, не понимаешь что такое dependency injection, а во-вторых - что делает твой код.

    Если отбросить все умные и красивые слова которые ты тут наскреб по сусекам, то оба твоих примера - про type hinting. Только в первом кусочеке кода мы просим интерпретатор проверять входящий параметр, а во втором - возвращаемое значение.
    Type hinting двольно размытый термин, мне больше нравится "контроль типов", который используется в документации. Поскльку в данном случае это не "подсказка", а строгий контроль: скрипт упадёт с ошибкой если в первом примере в метод придет что-то отличное от класса реализующего интерфейс Foo, а во втором - если метод вернет что-то отличное от такого класса.

    Контроль типов надо использовать, чтобы твой код был чище и работал предсказуемее.

    При этом dependency injection вообще не имеет никакого отношения ни к твоим примерам, ни к контролю типов. Внедрение зависимости относится к классам, а не методам. И означает, что если твой класс использует в работе какие-то инструменты, то он берет их не из воздуха - из всяких жлобал, синглетонов, контейнеров, или клепает прямо на месте - а явно получает при создании в виде параметров конструктора.
    Внедрение зависимостей следует использовать, чтобы твой код было легче изменять и поддерживать.
    Ответ написан
    6 комментариев
  • Как верстать под печать?

    @acwartz
    Тут должна быть ваша реклама.
    Но мне кажется, что это ерунда. Туда отдельно писать код для всей страницы снова?

    На чистом CSS - да.

    Чтобы скрасить монотонность копирования одного и того же, существуют препроцессоры css (LESS, SCSS, Stylus), и вместо дублирования под все медиа, Вы сразу пишите медиа запросы к конкретному классу, в последующем препроцессор сформирует нужное, и оно будет ожидаемо работать.
    Например:
    .sidebar {
      width: 300px;
      @media screen and (orientation: landscape) {
        width: 500px;
      }
      @media screen and (min-width: 640px) {
        width: 350px;
      }
      @media print {
        display: none;
      }
    }

    на выходе будет:
    .sidebar {
    	width: 300px;
    }
    
    @media screen and (orientation: landscape) {
    	.sidebar {
    		width: 500px;
    	}
    }
    
    @media screen and (min-width: 640px) {
    	.sidebar {
    		width: 350px;
    	}
    }
    
    @media print {
    	.sidebar {
    		display: none;
    	}
    }


    Отладка меди-запросов включается в DevTools доп утилитах рендера:
    5f9925e993892286417134.png
    Туть:
    5f99260ea64cd837540535.png
    Ответ написан
    3 комментария
  • Как верстать под печать?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Ну давай посмотрим на примере тостера.

    Попробуем распечатать страницу с вопросом.
    Для начала вопрос: для чего мы его распечатываем? Очевидно, нам интересен вопрос, и главное его решение. Именно это мы хотим распечатать на бумаге.

    Что же нам предлагают верстальщики из ТМ?
    5f98935dba783645914348.png


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

    Смотрим дальше
    5f98942e4692f875969058.png


    Форма комментирования. Ну что же. Наверное я отстал от современных технологий в своей деревне и во всем мире уже давно можно комментировать распечатанные страницы...

    В самом конце аж три листа совершенно бесполезной информации.

    В общем мы видим совершенно не оптимизированную под печать страницу.

    А вот если не забывать про печатные устройства, можно все это лишнее как минимум спрятать.
    Ответ написан
    2 комментария
  • Чем плохо выносить повторяющиеся элементы дизайна в отдельные файлы и подключать их потом с помощью PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Тут, как обычно, не одна проблема, а три.

    Первая проблема - это, как всегда, неумение задавать вопросы.
    Вот и сейчас - вопрос "чем плохо ходить пешком?" Что можно ответить на этот вопрос?
    Но потом выясняется что вопрос на самом деле "Я живу в 20 километрах от работы. Чем плохо ходить на работу пешком?".

    То есть вопрос у нас на самом деле, "Чем плохо выносить повторяющиеся элементы HTML в отдельные файлы и подключать их потом с помощью include?". Этот вопрос уже будет более осмысленный, и на него даже можно дать ответ не выглядя при этом идиотом.

    Вторая проблема заключается в том, что подход с "хидером и футером" реально неудобен и устарел уже лет 20 как. И вместо него используются шаблонизаторы. Тупо редактировать хтмл удобнее когда он лежит в одном файле, а не в header.php. footer.php. menu.php, banners.php и еще 10 файлах.
    И это я даже не заикаюсь о случае, когда на разных страницах надо поключать разные файлы стилей и скриптов.

    И третья проблема заключается в том, что хотя в принципе и можно что-то несложное накалякать с хидером и футером, но поголовно все новички все равно клепают их неправильно - а именно вкрячивают хидер до того, как скрипт вообще начнет работу. И потом имеют все прелести невозможности вывести НТТР заголовок, поменять что-то в хидере в зависимости от выводимых данных, поменять формат вывода или аварийно завершить работу.
    Ответ написан
    Комментировать
  • Как можно защитить верстку?

    DevMan
    @DevMan
    единственный надёжный вариант - слать скриншоты низкого качества.
    всё остальное не спасет от ушлых.

    а вообще, есть золотое правило: "не работать с мудаками". правда вырабатывается оно не сразу.
    Ответ написан
    12 комментариев
  • Правильно ли я понял централизованную обработку исключений в PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В целом правильно, неплохая проработка материала.
    У меня есть только пара замечаний, не относящихся напрямую к централизованному обработчику.

    • error_reporting(E_ALL & ~E_NOTICE); делать не стоит. Если только не приходится работать с адовым легаси, которое сыпет нотисами, лучше отлавливать все ошибки. Учитывая же что в 8-ке обращение к несуществующей переменной станет не нотисом а предупреждением, такая конструкция со временем станет бессмысленной. что означает - ошибки надо исправлять, а не замалчивать.
    • ini_set("error_log", __DIR__ . "/php-errors.log"); будет не очень хорошей идеей, если файл error-handler.php выше корня веб-сервера. Ошибки надо прятать подальше.
    • ini_set('display_startup_errors', 1); - это какая-то дичь, которая кочует из руководства в руководство. Никто никогда этих стартап еррорс не видел, но многие старательно пишут это заклинание у себя в коде. Это по-любому связано с настройкой сервера, и в отладке ошибок поможет примерно ничем.
    • само по себе задание настроек через ini-set ненадежно. Ошибка может случиться до того, как РНР прочитает эту команду. Задавать надо в конфигурации веб-сервера.
    • в теории можно добавить флаг или автоматическую проверку на джейсон запрос. и соответственно кодировать ответ в джейсон. Но это только для криовруких фронтендеров, которые не умеют читать НТТР статусы, а ждут что им все разжуют в джейсоне, и без error: true они не поймут, что была ошибка
    • стек вызовов может быть довольно длинным, и раздувать логи. Можно подумать о более укороченном варианте.


    Вообще всё зависит от задач. Например все современные фреймворки в режиме разработки выдают развесистую страницу с отчетом об ошибке, которая включает в себя и кусок кода вокруг строи, на которой произошла ошибка.
    Но как именно базовый обработчик, необходимый минимум - вполне годно.

    Я только не понял, почему вопрос про error_handler. Что именно смущает?
    Ответ написан
    5 комментариев
  • Как в Symfony загрузить DTO в Entity?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Вообще это плохая практика — маппить на сущность дто.

    Почему: сущность — некоторый бизнес-обьект, он контролирует переходы состояния и инкапсулирует саму логику. Но сущность находится в контексте... бизнес-процесса, который выражен некоторым др видом классов (интеракторы или use cases, если терминами Боба Мартина), например в CQRS таким родом классов являются хэндлеры команд.
    Итог: с сущностями напрямую скорее не стоит работать, тем более в сущностях не должно быть сеттеров :) и методов превращения данных из дто в явном виде ака fromDto(), как указал Flying (при всем моем уважении), тк это не бизнес-логика, а некоторая транспортно-приложенческая... Статические конструкторы могут быть, но не для дто, а для определенных данных, отображающих бизнес-возможность.

    Кроме того, ваше решение чревато высокой связанностью — ваши сущности конструируются под дто, дто под сущности...

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

    @podde
    самый младший сисадмин
    Не вините себя. У вас объективно очень много времени уходит на дорогу.
    Совершенно серьёзно думаю, что в такой ситуации надо попробовать поговорить с руководителем на предмет хотя бы частичной (пару раз в неделю) удалённой работы. А лучше попробовать вообще выпросить удалённый режим.
    Если нет – пробовать искать другую работу (поближе к дому или удалённую).
    Ну, действительно, по пять часов в день на дорогу – это не дело.
    Ответ написан
    Комментировать
  • Как создать entity не по стандартному пути?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Так нельзя

    Как вариант (если у вас все сущности все равно находятся в неймеспейсе Entity, т.к. он захардкожен) - конфигурировать бандл перед каждой генерацией, а потом возвращать назад
    maker:
        root_namespace: 'App\Common'


    Не забудьте добавить неймспейс в конфиг доктрины до генерации, т.к. иначе вы сгенерируете класс сущности и репозиторий, но добавить поля вам не дадут.
    mappings:
        App:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
            alias: App
        AppСommon:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Common/Entity'
            prefix: 'App\Common\Entity'
            alias: AppСommon
    Ответ написан
    2 комментария
  • Своя иерархия папок в Symfony?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    1. https://github.com/symfony/recipes/blob/master/doc...
    Но идея плохая, т.к. миграции - это не код.
    2. Можно при конфигурировании контейнера и роутов в Kernel.php разбирать структуру папок и подключать все динамически там.
    3. Нет. Как создать entity не по стандартному пути?

    FYI, моя структура папок сейчас выглядит так:
    migrations/
    src/
    -- Controller/
    ---- User/
    ---- ModuleName/
    -- Entity/
    ---- User/
    ---- ModuleName/
    -- User/
    --- Dto/
    --- Repository/
    --- Service/
    -- ModuleName/
    --- Dto/
    --- Repository/
    --- Service/

    Во-первых, нет заморочек с конфигурированием, во-вторых, если первый раз включаешься в проект, то идеально сразу видеть набор сущностей и контроллеры, а не бегать по папкам модулей в их поисках, плюс контроллеры часто сложно отнести к какому-то конкретному модулю.
    Ответ написан
    1 комментарий
  • Переход с React на Angular, стоит ли?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    1) правда ли изучаешь один раз и применяешь везде?

    да.
    У нас не принято собирать разнообразные велосипеды из набора либ. Разве что стейты vs сервисы :)
    Меня всегда это вымораживало в реакте, чтобы реализовать привычные вещи приходится тащить черти что и еще выбирать самому. А чтобы выбирать нужно уже знать варианты.

    2) как обстоят дела в крупных проектах?

    По разному, но в целом они похожи все. Если разработчики достаточно опытны в ангуляре и ООП, чтобы писать нормально.

    Архитектура приложений будет больше зависеть не от Ангуляра, а от знакомства разрабов с принципами построения архитектур, которые в целом несложны.
    Сам Ангуляр ничего не навязывает, Nuxt в этом плане даже более структурирован. Однако и так все само получается примерно схоже. Отчасти поэтому nuxt/next для ангуляра не существует.
    Еще популярен Nx, который помогает собрать монорепу из angular+nestjs например.

    стоит ли?

    Определенно стоит ознакомиться. Некоторые практики, без которых Ангуляр сложно представить, можно использовать и в react. Например di, если еще не используете.
    Ответ написан
    Комментировать
  • Как в симфони делить проект по NameSpace?

    glaphire
    @glaphire
    PHP developer
    Шарить между проектами - делать как бандл/композеровский пакет.
    Просто использовать в проекте - создавать условно < project name >/src/Module/< module name> и всю логику писать в пределах App\Module\ModuleName.
    Ответ написан
    3 комментария
  • Как прокрутить страницу на 50px вверх после перехода по ссылке с якорем?

    @Steppp
    Ничего не понятно, но очень интересно)

    В верстке сделай дополнительно div с якорем, и на позициях подними div на 50px вверх
    Ответ написан
    3 комментария
  • Как добавить поле в высоконагруженную базу в таблицу на продакшене где 100 миллионов записей?

    2ord
    @2ord
    В MySQL 8+ добавили ALGORITHM=INSTANT к синтаксису:
    ALTER TABLE table_name [alter_specification], ALGORITHM=INSTANT;

    The benefit of the INSTANT algorithm is that only metadata changes are made in the data dictionary. There is no need to acquire metadata lock during SE changes and we don’t touch the data of the table.

    https://mysqlserverteam.com/mysql-8-0-innodb-now-s...
    Ответ написан
    Комментировать