Задать вопрос
  • Объясните мне index.php в Symfony?

    @tukreb
    А погуглить вообще никак? Ответы уже есть в интернете
    https://stackoverflow.com/questions/75511390/the-e...
    Ответ написан
    1 комментарий
  • Есть ли другой вариант делать генерацию списков на php через js?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    или есть другой способ, более простой?
    Конечно есть
    <input type="time">
    Ответ написан
    Комментировать
  • Откуда неадекватный размер ext4.vhdx?

    @sasa2111
    Начинающий Data scientist
    Есть еще один способ уменьшить размер этого файла.
    1. зайти в Docker Desktop
    2. нажать на Troubleshoot (сверху справа жучок такой)
    3. Там выбрать Clean / Purge data
    4. и среди вариантов выбрать WSL 2

    У меня после этого действия ext4.vhdx уменьшился с 34 гигов до 1,1 гб.

    До этого я, правда, снесла все контейнеры и образы, какие там были, т.к. надеялась, что это даст результат, но память как была занята этим файлом, так и оставалась.
    Ответ написан
    3 комментария
  • Использовать ли геттеры в классе где объявлены приватные свойства?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    геттеры и сеттеры именно для этого и нужны - чтобы далеко далеко в будущем, когда будет много других классов, и которым нужны эти данные, и вдруг тип данных нужно будет поменять (например перейти от int32 к int64), то будет достаточно просто поменять тип приватных данных, поправить геттеры, чтобы они конвертили в int32 для старых зависимостей и сделать два новых 64-битных геттера для новых.
    И потом уже все кто лазили за данными, либо будут потихоньку переходить на новые геттеры, либо сидеть на старых, но с ограничением.

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

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

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. Учимся задавать вопросы.
      Спрашивать в заголовке как сделать что-то, а ниже приводить код, который это делает - это попахивает шизофренией
    2. Учимся отлаживать свой код.
      Поскольку вопрос на самом деле - это классическое "почему у меня ничего не работает?".


    Давайте по шагам, как детстве с мамой
    1. Что выводит echo "../local/$id.*.$login_*";? Соответствует ли вывод ожиданиям? Если нет - то в чем различия? Что должно вывести и что вывелось?
    2. Если ответ на первый вопрос положительный, то что выводит var_dump(glob("../local/$id.*.$login_*")); Соответствует ли вывод ожиданиям? Если нет - то в чем различия? Что должно вывести и что вывелось?
    3. Если ответ на второй вопрос положительный, то каков результат работы кода? Соответствует ли он ожиданиям? Если нет - то в чем различия? Что должно было удалиться, и что удалилось?
    4. Включен ли вывод ошибок? Если нет - то надо включить. Если включен и выводятся - то какие?
    Ответ написан
    5 комментариев
  • Возможно ли сделать mock сервиса?

    gaparchi
    @gaparchi
    expects:
    $mockCategories->expects(self::once())->method('findAll')->with($id)->willReturn($types);


    Но если, это не юнит тест и ты поднимаешь приложение.
    То перед запросом переопредели этот сервис в контейнере.
    $client->getContainer()->set(BenefitCategoryRepository::class,  $mockCategories);
    Ответ написан
    2 комментария
  • Как кастомизировать ексепшены в общем методе?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Первый вариант - это однозначно глупость. Какое-то совсем уже натягивание процедурного подхода на ООП.
    Второй какой-то невнятный, про него ничего нельзя сказать толком.

    В общем случае, как правильно написал sl0 в комментарии, кидать надо ОДИН тип исключения, но с разными сообщениями.

    В данном конкретном случае, поскольку речь идёт о валидации, то никакое исключение в принципе кидаться не должно. Исключение кидается в случае, если функция не может выполнить свою работу. Но для функции checkParam() невалидный параметр НЕ ЯВЛЯЕТСЯ исключительной ситуацией. Потому что роль этой функции - как раз и определить валидность переданного параметра. В случае неверных данных функция должна записать сообщение об ошибке во внутренний массив ошибок класса-валидатора и вернуть false.
    spoiler

    Исключение в случае неверных параметров может кидать например функция сохранения в БД. Потому что её задача - сохранить переданные данные, а не валидировать их. И в случае, если функция не может сохранить данные - она должна кинуть исключение, в том числе из-за невалидности данных.
    Ответ написан
    9 комментариев
  • Как приветси GET-ответ в удобочитаемый вид?

    @alexalexes
    Можно хоть с браузера изучать содержимое JSON:
    1. Открываете средство разработчика в браузере F12.
    2. Открываете консоль.
    3. Пишите:
    Текст вашего JSON;
    4. После нажатия Enter появится строчка со скомпилированным результатом. Теперь можете бродить по внутренностям этого объекта как по дереву каталогов.
    Ответ написан
    Комментировать
  • Не вызовут ли аттрибуты phpstorm проблем в продакшене?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не вызовут, если версия РНР "на проде" не меньше 8.0
    Введение в атрибуты
    Ответ написан
    2 комментария
  • Как сделать миграцию в Symfony?

    @tukreb
    Чтобы не было проблем с индексами и c постоянное перегенерацией имём индексов, нужно создавать их вручную
    https://www.doctrine-project.org/projects/doctrine...
    https://www.doctrine-project.org/projects/doctrine...

    Исключение только для manyToMany

    Насчёт генераций полей таблиц, тут тоже самое, нужно вручную прописывать все поля (name/type/length/nullable) в сущности, если не хотите получить каламбур и непонятное поведение доктрины
    https://www.doctrine-project.org/projects/doctrine...
    Ответ написан
    Комментировать
  • Как сделать чтобы при неправильном вводе пароля была ошибка?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    пишет-Сейчас эта страница не работает,
    смотрим логи, а лучше включаем вывод ошибок. После этого внимательно читаем ошибки и исправляем.

    $password = md5($password."ghjsfkld2345");
    забыть как страшный сон, читаем про password_hash(), делаем как надо.

    $result = $mysql->query("SELECT * FROM `users` WHERE `login` = '$fullname' AND `pass` = '$password'");
    Читаем про подготовленные выражения, автору видео ставим дизлайк и больше всякое г не смотрим.

    setcookie('user', $user['fullname'], time() + 3600 * 24 * 90, "/");
    работать с куками вместо сессии - отдельный вид некомпетентности, точнее - открытое вредительство.

    $mysql->close();
    Абсолютно лишняя строка, драйвер сам закрывает соединение по завершении скрипта, делать это вручную нужно лишь в исключительных случаях, еще один пинок в карму...
    Ответ написан
    7 комментариев
  • Как добавить www-data в alpine образ?

    @Tiasar
    Web Developer
    в alpine группа www-data есть с uid 82
    добавить пользователя можно так:
    adduser www-data -S -H --disabled-password -g "www-data" -h /dev/null -u 82 -G www-data

    Но тогда для пользователя и группы ID будут 82, а в той же ubuntu ID 33

    Я бы сделал по другому. Для обоих образов (nginx и php) добавил бы одинаковые группы и пользователи, скажем www:www с ID - 1010 через Dockerfile:
    RUN addgroup -S -g 1010 www && adduser www -S -H --disabled-password -g "www" -h /dev/null -u 1010 -G www

    ну и в том же Dockerfile указал что запускаться из под этого пользователя:
    USER 1010
    На хост машине тоже бы добавил пользователя и группу с таким же ID

    Ну и в конфигах nginx и php указал бы пользователя www
    Ответ написан
    Комментировать
  • Как читать вывод git diff?

    @res2001
    Developer, ex-admin
    Файл был переименован. index, видимо, показывает коммит где файл появился первоначально с правами на файл 0644 (стандартные права файловых систем Unix). 10 - "обычный файл".
    Утилита stat выводит такую же инфу о правах, но в шестнадцатиричном виде, а тут восьмеричный.
    Вместо 10 может быть еще 12 - ссылка, и возможно еще какие-то варианты.

    Три минуса и три плюса - стандартное для diff обозначение для сравниваемых файлов. Типа первый файл это ---, второй файл +++.
    Цифры в @@ отрицательная - это "строка, колонка" для первого файла, положительная - для второго. Указывают место где файлы различаются.
    Ответ написан
    Комментировать
  • Как можно оптимизировать этот код?

    @tukreb
    Здесь только выкинуть и написать с 0. Боже упаси такой код в продакшен пускать.
    Но раз у вас нашёл такой кусок кода, то значит весь проект нужно выкидывать и брать нормальный фреймворк где нельзя так страшно гавнокодить.

    А чисто по этому коду, вам для начала надо начать с этого https://www.php.net/manual/ru/pdo.prepared-stateme...
    Ответ написан
    Комментировать
  • Как преобразовать полученное значение даты в другой формат?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    print (new DateTime('Mon, 6 Jun 2022 10:27:43 +0300'))->format('Y-m-d H:i:s');
    // 2022-06-06 10:27:43
    Ответ написан
    6 комментариев
  • Почему symfony удаляет автоинкремент в миграциях?

    @tukreb
    Потому что SEQUENCE не для PostgreSQL, а для MySQL и его клонов.
    Для PostgreSQL нужно использовать IDENTITY

    /**
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private int $id;

    А если вам нужно установить какое то правило например начинать с 100, то вообще нужно NONE

    /**
         * @ORM\Column(type="id")
         * @ORM\GeneratedValue(strategy="NONE")
         * @ORM\SequenceGenerator(sequenceName="custom_seq", initialValue=100)
         * @ORM\Id
         */
        private int $id;
    Ответ написан
    1 комментарий
  • Как правильно наследовать бандл?

    Комментировать
  • Как получить количество пользователей с 2 заявками?

    Fragster
    @Fragster
    помогло? отметь решением!
    select count(*) from (select user_id from events group by user_id having count(event_id) >= 2)
    Ответ написан
  • Есть код в PHP с img src но когда я открываю его в браузере то пишет img src(unknown)?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Есть такой простой код, но, он не работает, почему то.
    Все работает, просто вы не умеете работать с данными (надеюсь пока что)

    Что делать

    Во первых научиться пользоваться var_dump(), убедиться что в $_SESSION['user']['avatar'] ничего нет, или лежит что-то неадекватное, проверить запись в бд и убедиться что там это поле пустое, ну или так же содержит что-то неадекватное.

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