• Где лучше качество кода?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Все плохо
    • Глобальные переменные — зло
    • На лицо некий код, который и с сессией работает и с БД — явное нарушение общепринятных принципов, например SRP
    • $dao как инициализирована? Явно не через конструктор
    • Использование цифры, вот сиди гадай по ней — это плохо, используйте именованную константу. Например 3 — это некий статус для desktop, вот и назовите ее STATUS_DESKTOP, хотя далее...
    • вы обращаетесь к одному методу, который шибко умный — работает с флагами, тем самым нарушая SRP и сам содержит if/else, сделайте просто 2 раздельных метода:
      getMobileOpinionList()
      getDefaultOpinionList()

    • Предикат лучше вынести в отдельный метод isMobileOnly(), тк условия могут поменяться в нем, не будете же везде в if менять по всему проекту
    Ответ написан
    33 комментария
  • Зачем нужен ActiveQuery в Yii2?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Если быть более, конкретным, зачем нужна эта опция, при генерации модели через Gii?

    Чтобы вы могли добавить свои кастомные методы или переопределить родные (all(), one() и другие, короче переопределить родной ActiveQuery и изменить на свои абстракции)

    Вот пример контроллера:
    actual() -- такого метода нет в ORM, а мне нужен, ну вот хочу так пользоваться:
    $trainings = Training::find()->actual($date);

    ActiveQuery

    Ну раз нужен -- добавляем такой метод
    class TrainingQuery extends \yii\db\ActiveQuery
    {
        public function actual($date)
        {
            return
                $this->alias('t')
                ->joinWith(['lesson l' => function($q){
                    $q->joinWith('studio s');
                }])
                ->andWhere(['l.active' => 1])
                ->andWhere(['s.active' => 1])
                ->andWhere(['t.date' => $date])
                ->all();
        }
    }

    Сущность

    В сущности перенацеливаем родной find() на мой кастомный
    class Training extends \yii\db\ActiveRecord
    {
    ...
    public static function find()
        {
            return new \mynamespace\entities\query\TrainingQuery(get_called_class());
        }

    Ответ написан
    3 комментария
  • Зачем нужен ActiveQuery в Yii2?

    @iSensetivity
    бухгалтер, програміст-самоук
    Например, для такого:
    https://github.com/samdark/yii2-cookbook/blob/mast...

    Или для вьізова цепочек типа:
    User::find()->active()->haveSale()->bornToday()->all();
    Ответ написан
    Комментировать
  • Какой торрент клиент посоветуете вместо uTorrent?

    @Arvur
    Выбранное решение с патчем для uTorrent безусловно красиво, но...
    Мое решение - qBittorrent. Теплый и ламповый, как первые версии uTorrent'а ;-)
    Никаких костылей и никакой зависимости от потерявших доверие разработчиков.
    Ответ написан
    9 комментариев
  • Как в docker работать с несколькими проектами?

    @bankinobi
    Приятнее работать будет с таким количеством проектов, если пропускать их всех через traefik. Дополнительные 3-4 строки нотификаций к описанию проекта в docker-compose файле и все видится через одну точку входа.
    Ответ написан
    Комментировать
  • Как перейти с utf8 на utf8mb4 в MySQL?

    borisdenis
    @borisdenis
    Ленив и вреден...
    При такой конфигурации
    [mysqld]
    init_connect='SET collation_connection = utf8mb4_unicode_ci'
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    
    [client]
    default-character-set = utf8mb4

    имеем

    +--------------------------+--------------------+
    | Variable_name                  | Value                       |
    +------------------------------+------------------------+
    | character_set_client          | utf8mb4                  |
    | character_set_connection | utf8mb4                  |
    | character_set_database    | utf8mb4                  |
    | character_set_filesystem  | binary                      |
    | character_set_results       | utf8mb4                   |
    | character_set_server        | utf8mb4                   |
    | character_set_system       | utf8                          |
    | collation_connection        | utf8mb4_general_ci |
    | collation_database          | utf8mb4_unicode_ci |
    | collation_server               | utf8mb4_unicode_ci |
    +-----------------------------+------------------------+
    10 rows in set (0.01 sec)
    Ответ написан
    2 комментария
  • Почему так странно ищет substr?

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

    Во-вторых переменные $posnamevalstart и $posnamevalend у вас имеют одинаковые значения. Раз вы ищете в обеих переменных одинаковые значения, то нужно смещать начальную точку:
    $posnamevalend = mb_strpos($findstr, "\"", $posnamevalstart + 1);

    В-третьих третьим параметром в функции substr() передается ДЛИНА ВОЗВРАЩАЕМОЙ СТРОКИ. Значит нужно написать эту строку следующим образом:
    $namevalue = mb_substr($findstr, ($posnamevalstart + 1), ($posnamevalend - $posnamevalstart - 1));

    Ну и самое главное - зачем вы вообще это делаете? Если просто понять как работать с strpos() и substr() то окей. А так у вас там обычная сериализованная строка (только почему-то обрезанная вами), которая представляется в массив функцией unserialize()
    Ответ написан
    6 комментариев
  • Бесплатный таск-трекер для локальной сети?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    redmine
    mantis
    bugzilla

    ...тысячи их... Хотя мне больше всего нравится redmine. Правда, он на руби написан и соответственно потащит зиллион его модулей.
    Ответ написан
    Комментировать
  • PHP DomDocument: почему, после обработки, неправильно закрыты теги?

    TommyV888
    @TommyV888 Куратор тега PHP
    -
    У вас возникает эта проблема из-за использования LIBXML_HTML_NOIMPLIED, либо не используйте его, либо оберните код в <html> тег, вот тут говорится об этом подробнее:
    https://stackoverflow.com/a/36547335
    Ответ написан
    Комментировать
  • Ошибка при git push?

    v_decadence
    @v_decadence
    Ошибка из-за того, что Git по умолчанию не разрешает обновлять текущую ветку не bare-хранилища посредством push.

    На сервере либо инициализируем хранилище так:
    git init --bare
    Это создаст хранилище без рабочей копии (bare хранилище)

    Либо задаём в конфиге хранилища:
    [receive]
    denyCurrentBranch = ignore (или warn)
    Чтобы можно было пушить в текущую ветку не bare хранилища.

    Второй способ не рекомендуется, так как может привести к конфликтному состоянию рабочей копии.

    Если на сервере должна быть рабочая копия, то только второй способ либо сделать bare-хранилище, куда пушить с клиента (оно будет точкой синхронизации), а в месте, где нужна рабочая копия, склонировать первое хранилище и периодически из него делать pull.

    Bare-хранилище
    Ответ написан
    6 комментариев
  • Почему Git считает конфликтом два совершенно одинаковых кода?

    shai_hulud
    @shai_hulud
    Возможно разные line-endings на этих строках (/r/n и /n)
    Ответ написан
    Комментировать
  • Composer autoload как работает?

    @smple
    он подгружает только то что требуется в коде
    там загрузчик добавляется через php.net/manual/ru/function.spl-autoload-register.php
    Ответ написан
    Комментировать
  • Как урезать свой перфекционизм?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Цените свое время и деньги.
    За перфекционизм не платят, платят за работу, которая соответствует требованиям заказчика, а не вашим личным.

    Перфекционизм должен вам помочь не стоять на месте и постоянно развиваться, но это означает, что делая работу вы все время обращаете внимание на мелочи и учитесь их делать лучше - в будущем это вам поможет сразу делать круче и соответственно находить более сложные и высокооплачиваемые задачи.

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

    Короче. Правильно ставьте приоритеты.
    Ответ написан
    Комментировать
  • Как урезать свой перфекционизм?

    isqua
    @isqua
    Научу HTML, CSS, JS, BEM и Git
    Чтобы перестать делать лучше то, что ещё не сделано до конца, нужно понять одну простую истину: Запущенный проект лучше, чем не запущенный.

    Давайте потренируемся:
    • Что лучше: запущенный проект с несжатыми стилями или незапущенный со сжатыми?
    • Что лучше: не запущенный проект с десятью страницами или запущенный с тремя?
    • Что лучше: запущенный проект c jQuery или не запущенный без jQuery?


    Надеюсь, вы смогли выбрать! Как узнать, что пора запустить проект? (Под запуском я имею в виду «показать людям». Например, если вы решили написать библиотеку, давайте считать «проект запущенным», если вы выложили её на гитхаб) Нужно прикинуть, сколько времени вам надо на разработку и умножить на два. Если получилось больше двух недель, то стоит разбить проект на части и прикинуть так про каждую часть. Соответственно, ставите дедлайны.

    Промежуточные дедлайны помогают успеть к последнему. Старайтесь сначала реализовать основную функциональность, а потом дополнительную. Если не успеете к дедлайну доделать дополнительное — сначала запустите основное, а потом видно будет, надо ли вообще доделывать дополнительное.

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

    Удачи!
    Ответ написан
    4 комментария
  • Как привязать к проекту 2 репозитория SVN и GIT?

    ilivit
    @ilivit
    Я для подобной задачи использовал git-svn. Не заню, может ли SmartGitHG работать с ним, я работал через SourceTree и консоль. В общем случае, выкачивается svn репозиторий через git-svn (в SourceTree это делается в 2 клика), а затем добавляется удаленный репозиторий git. В моем случае репозитории были идентичными, поэтому я просто коммитил в git (возможно нужно еще и сделать push), а затем делал rebase коммитов на trunk и пушил коммиты.
    Ответ написан
    Комментировать
  • Как выбрать строку до определенных символов?

    @MiiNiPaa
    Используйте группы захвата: https://regex101.com/r/qN5qP8/3

    UPD: Обновил, регексп теперь с альтернативными группами
    Ответ написан
    Комментировать
  • Рандом числа. Нужны не одинаковые цифры. Как сделать?

    Ivanq
    @Ivanq
    Знаю php, js, html, css
    function random(digits) {
    	if(digits > 10) return false;
    	var dg = "";
      var k = Math.floor(Math.random()*9)+1; // 0 вначале не модет идти
      dg += k;
      for(var i=0;i-1) {
      		var k = Math.floor(Math.random()*10);
        }
        dg += k;
      }
      return parseInt(dg);
    }


    В общем, так: даешь функции в параметре количество цифр, она тебе возвращает число. Краткий алгоритм:
    • Поставить в переменную цифру от 1 до 9 (0 не может быть первым)
    • ПАРАМЕТР-1 раз повторить:
      • Сгенерировать случайную цифру от 0 до 9
      • Если цифра уже есть, вернуться к предыдущему шагу
      • Дозаписать цифру в переменную

    Ответ написан
    Комментировать
  • Как не дублировать настройки php-fpm в каждом location?

    mr_T
    @mr_T
    Web-разработчик
    include как бы намекает, что можно вставлять куски конфигов из отдельных файлов. Создаешь файл с тем, что нужно, и просто пишешь include my-awsome-config-file.
    Ответ написан
    Комментировать