• Хорошая ли практика создавать свои классы Exception для отлавливания разных ошибок?

    @galliard
    Практика хорошая. Именно так и стоит делать. В идеале у каждой ошибки должен быть свой уникальный эксепшн. Например, от FileException можно наследовать например NotFoundFileException и AccessFileException. При этом тело классов в большинстве случаев будет пустым.

    А вот то, что ты пытаешься поймать все возможные эксапшны в контроллере - это совсем не хорошо. По хорошему нужен отдельный эксепшн хендлер для этого.
    Ответ написан
    6 комментариев
  • Как въехать в программирование (ООП, паттерны)?

    GTRxShock
    @GTRxShock
    Full-stack developer (Symfony, Angular)
    если программируете на php 2-3 года, то пора бы перед сном почитать РНР: объекты, шаблоны и методики программирования (Зандстра) желательно в бумажном варианте.

    + Паттерны проектирования (Фримен) для общего/наглядного понимания паттернов
    + www.phptherightway.com основные тезисы
    + Рефакторинг: улучшение проекта существующего кода (Фаулер) & https://refactoring.guru/ru на будущее, к чему стремиться :)
    Ответ написан
    4 комментария
  • Простейшая очередь задач на PHP?

    Stdit
    @Stdit
    Один из самых простых способов организации фоновых задач (таких как отправка письма, например) — делегировать их скрипту в cron-е через базу данных. То есть записывать задачу с аргументами в таблицу-очередь, а кроном эту очередь разбирать по таймеру. Если по каким-то причинам это не подходит (например, из-за скорости реакции или нагрузки на бд), то наверное смотреть в сторону gearman.
    Ответ написан
    1 комментарий
  • Как писать тесты?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Тесты нужны для автоматического получения информации о состоянии продукта. Если у вас нет вопросов, т.е. вы во всем уверены, то и тесты как бы не нужны (ирония). Вы ведь каждый день перед тем как сесть за руль смотрите не сдулись ли колеса? Смотрите на уровень бензина. Слушаете как работает мотор на холостом ходу. Проверять работают ли светофоры не нужно, вы на них не можете повлиять. Проверять есть ли пробки на дорогах нет смысла, вы на них не можете повлиять. А вот состояние вашего автомобиля, да. Так же и с ПО. А с чего начать - логично, с самых критичных вещей. Чем виднее и центральнее функция, тем важнее ее покрыть тестами.
    Ответ написан
    4 комментария
  • Разве Composer бесполезен в 2017?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Вали от туда

    А вообще вопрос глуповат. Если там php 5.4 и Kohana старенькая, то конечно они не используют композер.
    Если нет тестов — не всегда плохо, очень много проектов без тестов работают. Да там ты не научишься хорошему программированию, но не так все ужасно... можно потихоньку их притащить, но не всегда это нужно бизнесу (вообще это задачи тимлидов и гигиены разработчиков)

    А вот ответ Тимлида ужасен. Почему это выяснилось не на собеседовании?

    Не ужели с вашим подходом к программированию и опытом вас не взяли в компанию получше?

    UPD: Очень хороший ответ ниже по ссылке -- Разве Composer бесполезен в 2017?
    Ответ написан
    3 комментария
  • Почему в textarea окончания строк \n, а в POST уже \r\n?

    @zim32
    Вот что я нашел на просторах интернета.
    When submitting the form, all browsers canonicalize newlines to \r\n (%0D%0A in URL encoding).

    Т.е. скорее всего перед отправкой на сервер, символ новой строки нормализуется до "канонического"
    Ответ написан
    3 комментария
  • Как разбить сложное представление на части?

    YokiToki
    @YokiToki
    PHP-разработчик
    Не совсем понял суть вопроса, но возможно стоит посмотреть сюда https://github.com/yiisoft/yii2/blob/master/docs/g...
    Ответ написан
    2 комментария
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    Все красиво объяснил Nkly777, только в блоке PS merge с rebase перепутаны.
    Добавлю картинок.

    git rebase devel - собачка на молнии - "сшивает" коммиты по дате их создания
    (ветка devel "растворяется" в основной ветке)
    518b8dbce1cd4f96b30de9782ae38fcd.png
    git merge devel - пожарная лестница, все коммиты ветки devel крепятся в конец, образуется пересечение
    (devel остается отдельной веткой, к которой можно вернуться)
    1ba8186d879d46ff85ea7c1e192328e2.png
    git chery-pick idea - забрать коммиты из ветки idea
    2717e3091f644ef2954aa2de4514f446.png
    Ответ написан
    2 комментария
  • Как вы работате с гитом?

    git add, git commit следует выполнять лишь тогда, когда наращивается значимый функционал или полноценное исправление ошибки, при этом каждая фиксация (commit) должна означать, что программа будет работать исправно как до, так и после фиксации. То есть полурешения, приводящие к неисправной работе программы, фиксировать не следует.
    Просто "написал функцию" - это не функционал, а мёртвый код. До тех пор пока эта функция не будет вызываться где-то из кода. Желательно ещё дописать модульный тест для проверки работоспособности данной функции. Вот тогда имеет смысл фиксировать изменения.
    Или любое исправление, при котором с новым решением программа работает исправно (сбой не вызыван логическими ошибками и т.д.).
    Ответ написан
    3 комментария
  • Как перенять объектно-ориентированное мышление?

    AmberLEX
    @AmberLEX
    php/web-developer
    Дмитрий Елисеев
    www.elisdn.ru/oop-week
    Очень расжевывает и доступно объясняет.
    Есть много бесплатных видео, чтоб понять уровень.
    Это не очередной говно-курс как срубить бабок на перессказе документации.
    Посмотрите посты в блоге. Я правда курсы не проходил, но видео-материалы смотрел.
    Ответ написан
    Комментировать
  • Какой фреймворк выбрать для обучения?

    @Fortop
    Tech/Team lead
    Берите микрофреймворки Slim, Zend Expressive

    У вашего "быстро выучить" есть большой подвох, что вы и останетесь на том что выучили.

    Потому что такие фреймворки как laravel, yii провоцируют писать не очень хороший код.
    Ответ написан
    1 комментарий
  • Как разбить сложное представление на части?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    я решаю путем выделение функционала в модули которые содержат: контроллер и шаблон
    вызов в php шаблоне делаю: <?=Module("module_name")?>
    или в twig: {{module("module_name")}}
    Ответ написан
    2 комментария
  • Как разбить сложное представление на части?

    qonand
    @qonand
    Software Engineer
    А в чем проблема использовать описанную Вами конценпцию? это вполне нормальный вариант аля HMVC
    Ответ написан
    2 комментария
  • Что делать если команда говнокодит?

    Мы стараемся не запускать эту проблему посредством code review, пытаясь распределить нагрузку по ревью между наиболее опытными участниками. Если в коде есть проблемы - тикет возвращается на доработку с замечаниями. Даже если банально не мержится с главной веткой. Попробуйте наладить этот процесс.

    Также мы всё собираемся настроить Continuous Integration. Jenkins может прогонять по коду проверку на соблюдение стандартов и покрытие тестами, а затем показывать результаты в красивом виде. Если чей-то коммит показывает более чем N ошибок в расчёте на единицу объёма кода - можно возвращать на исправление.

    Прямо уж откровенной копипасты и лапши у нас вроде бы нет почти. Мы стараемся избегать её, придумывать декларативные абстракции во всех случаях, где много тупого императивного кода, писать в функциональном стиле. Я думаю, что необходимы постоянные целенаправленные усилия в этом направлении, чтоб не допускать засилья энтропии.

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


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

    Ну и важно, чтобы у самих разработчиков была установка на хороший код, профессиональная гордость. У фрилансеров её, бывает, нет, а есть отношение "тяп-ляп, лишь бы работало и лишь бы часы оплатили, а там хоть потоп". Учитывая, что их заказчики занимаются code review нечасто, развитие такого отношения закономерно. Но всё-таки хочется писать красивые программы. Такое желание обязано быть.

    Я, конечно, сам не волшебник, я только учусь, и работа с командой - такая штука, которой надо постоянно учиться. Видимо, вы тоже учитесь; успехов в этом.
    Ответ написан
    2 комментария
  • Какие книги почитать системному администраторy для изучения Python?

    vvpoloskin
    @vvpoloskin
    Инженер связи
    Из личного опыта - когда я работал сетевым алмином и у меня в эксплуатации было 8k разношерстного активного сетевого оборудования, питон я активно использовал для опроса по snmp разных девайсов, бота для телнета. Ещё для смены делал тупой веб интерфейс для того, чтобы на свичах можно было включить/выключить порт, подписать дескрипшен. Пытался делать на нем генератор конфигурации, но bash+sed для этого подошли лучше.

    Надо плясать от задачи, а не от языка. По моему скромному мнению питон избыточен для повседневного системного администрирования, возможностей баша хватает с головой. Он удобен для больших расширяемых програмулин, но часто ли надо писать самому такой софт админу? Также он хорош для сетевого программирования, но опять же, часто ли надо прогать сокеты? Полезен в распаршивании всяких html/xml.

    Однострочники писать на нем неудобно, а в бытовом админском скриптовании именно они составляют львиную часть работы.
    Ответ написан
    Комментировать
  • Yii2: ActiveRecord как получить НЕ связанные данные?

    @masterfreelance
    программист со стажем
    То есть как я понял вам нужно выбрать все новости у которых id нет в таблице news_read для данного customer_id?
    Если это так, то реализацию можно сделать следующую:

    public function getUnreadedNews()
        {
            return News::find()->where(['not in', 'id', $this->getReadNews()->select('id')]);
        }
    Ответ написан
    1 комментарий
  • Как в Yii2 записать ip адрес пользователя в БД при регистрации?

    mhthnz
    @mhthnz
    PHP, YII2, Golang, Linux
    $model = new User(['ip' => Yii::$app->request->userIP]);
    if ($model->load(Yii::$app->request->post()) && $model->save()) {
    ......
    }

    либо перед сохранением
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        $model->ip = Yii::$app->request->userIP;
        $model->save(false);
    }
    Ответ написан
    Комментировать
  • Знания Junior php разработчика?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что должен знать идеальный джуниор (мое личное мнение):

    - Сетевой стэк. Нужно иметь хотя бы базовое представление о том как с сервером общаются. Ну то есть не нужно лезть в дебри, но понимать что такое HTTP или чем TCP от UDP отличается - нужно. В целом это пара часов чтения википедии.
    - GIT или любая другая распределенная VCS. Базовые навыки, что бы хотя бы понимал что есть git revert или git rebase, что такое фичабрэнчи и примерное представление как это работает и зачем надо.
    - Базовые основы unix. Ну то есть что бы не пугаться таких вещей как ssh хотя бы.
    - PHP. Без этого никуда. Он должен понимать что такое слабая динамическая типизация (не заучивать табличку кастов типов, а понимать плюсы и минусы, такая же история с приоритетами операторов - не заучивать а знать как избегать проблем с чтением кода)
    - Понимать что код чаще читают чем пишут, а потому не экономить 5 минут на написании кода, а писать так, чтобы сэкономить 30 минут человеку, разбирающемуся в куске кода.
    - Знать базовые вещи в плане безопасности. XSS и как защищаться, SQL инъекции и как защищаться, CSRF, MITM. Понимать что такое NDA, что данные пользователей - секретная информация. Как хэшировать пароли (не md5 а password_hash) и почему это важно.
    - Знать SQL. Глубоких знаний не требуется, нужно лишь понимание того, что такое нормальная форма, желательно разобраться с вопросом денормализации данных. Идеально иметь хотя бы базовые представления о том как работать с NoSQL решениями.
    - Процедурное программирование: почему глобальные переменные порождают сложность, что такое состояние, как можно использовать классы для изоляции состояния и т.д. Инкапсуляция. Инварианты, пост/пред условия, сохранение целостности...
    - Разделение ответственности. Это один из важнейших принципов, и упрощать все это до "mvc фреймворк" слегка неправильно. Вы должны понимать что от чего отделяете и главное зачем.
    - Автоматические тесты. Джуниор должен знать что это такое и иметь хотя бы минимальный опыт их написания. Должен понимать разницу между юнит и интеграционными тестами. Быть знакомым с пирамидой тестирования.
    - Уметь решать стандартные задачи не задавая слишком много вопросов. Например регистрацию пользователя по email-у вы должны написать, или авторизацию через соц сети, или комментарии, или новостную ленту.
    - Уметь дебажить. xdebug, blackfire и тд.

    В целом где-то за годик весь этот список можно влегкую покрыть с нуля.

    p.s. Я в списке специально не указывал ООП, поскольку всеравно первые пару лет у разработчиков выходит процедурщина на классах. Это не плохо, но того что в моем списке более чем должно хватать для решения стандартных задач. Но термины вроде "инкапсуляция/полиморфизм/наследование" требуются в обязательном порядке подавляющем количеством интервьюверов, а стало быть знать это надо. Единственное что - рекомендую в свободное время глубже погрузиться в этот вопрос а не тупо заучивать формулировки.

    Так же вещи вроде docker джуниорам знать не обязательно просто потому, что их врядли допустят сходу к управлению инфраструктурой. А так пару неделек на изучение и вперед.
    Ответ написан
    12 комментариев
  • Как вывести DIV через ECHO?

    @holfza
    <?php if(isset($row)) :  ?>
                        <div class="uk-button-group">
                                <a class="uk-button uk-button-link uk-button-large" href="../auth/signup.php">Регистрация</a>
                                <a class="uk-button uk-button-success uk-button-large uk-margin-left" href="../auth/login.php" style="background-color: #ffb433;"onmouseover="this.style.backgroundColor='#eb8d00';" onmouseout="this.style.backgroundColor='#ffb433';"><i class="uk-icon-lock uk-margin-small-right"></i> Войти</a>'
                        </div>
    <?php  endif;  ?>
    Ответ написан
    Комментировать
  • DIV на всю высоту родителя?

    iiil
    @iiil
    Инженер и вэб-дизайнер, рисую.
    .parent {
      position: relative;
    }
    .child {
      position: absolute; 
      left:0;
      right:0;
      top:0;
      bottom:0;
    }
    Ответ написан
    9 комментариев