• Зачем нужны методы отправки данных отличные от GET, POST?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Удобно эндпойнты в апи делать

    [GET]    /order/{id}  получить информацию о заказе
    [POST]   /order/{id}  создать новый заказ
    [PUT]    /order/{id}  обновить данные в заказе
    [DELETE] /order/{id}  удалить заказ


    Вместо

    [GET]  /order/{id}
    [POST] /order/{id}/create
    [POST] /order/{id}/update
    [POST] /order/{id}/delete


    будет ли нормальная поддержка этих методов в том же php и формах html?


    https://caniuse.com/mdn-http_methods_put
    https://caniuse.com/mdn-http_methods_delete

    А что вы имеете ввиду под нормальностью в php? Определить метод запроса можно, прочитав $_SERVER['REQUEST_METHOD'], получить данные из php://input

    UPD

    Нашел вопрос аналогичный. Ответы краткие но емкие и по делу.
    https://stackoverflow.com/questions/27941207/http-...
    Ответ написан
    Комментировать
  • Чем mock отличается от stub в phunit?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    https://vc.ru/flood/44925-za-chto-ya-cenyu-testiro...

    Главное различие между stubs и mocks заключается в том, что в одном случае мы управляем состоянием, а в другом - поведением.

    Когда мы используем mocks, мы заменяем весь модуль на mock (ложный, тестовый объект, имитирующий настоящий). А stub - это функция, которая всегда выводит один и тот же результат, вне зависимости от того, что было подано на вход. Mocks используют для того, чтобы проверить, была ли функция вызвана с правильными аргументами, а stubs, чтобы протестировать, как функция работает с полученным ответом. Стабы нужны для проверки состояния метода, а моки используются для регулировки поведения.
    Ответ написан
    Комментировать
  • Почему SPA с SSR не популярны в e-commerce?

    Lucian
    @Lucian
    https://t.me/BusinessAndFreelance
    Привет, SPA хорошо в плане скорости, но куча минусов, это танцы с настройкой аналитики, рендера и индексированием в поисковых движках. На мой взгляд SPA, лучше использовать для админок или в закрытых проектах, еще в разработке мобильных приложений, а не там где нужно рендерить тысячи страниц.
    Ответ написан
    1 комментарий
  • Какие ресурсы прочитать или, может, книги,где описаны приемы проектирования ядра приложения?

    Jeer
    @Jeer
    уверенный пользователь
    Пробегите бегло по паттернам, возможно, найдете, что вам подходит https://refactoring.guru/ru/design-patterns/behavi...
    Ответ написан
    Комментировать
  • Почему PHP теряет популярность?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    PHP не мода, php - классика, а классика никогда не умирает. Если умрет php, то умрут все остальные языки backend разработки потому что появится что-то такое, что сможет в разы превзойти пхп в простоте, скорости и удобстве, на данный момент что джава, что питон, что руби +- одинаковые, каждый подходит для своих целей. Тот же питон выбирают из-за простоты интеграции нейронных сетей, но если говорить не о узких, а о главных параметрах (функционал, скорость и тд) все популярные бэк языки более или менее одинаковые смотрите те же сухие графики.
    А о уменьшении вакансий - глупость несусветная. трын тут приведена статистика за 2018 год и обоих графиках по вакансиям лидирует в сравнении с java/python PHP, при том на первых двух пишут как бэкэнд, так и миллион других штук. А на втором графике и вовсе пхп опережает js (единственный язык в самой популярной сфере разработки).

    А вот если речь идет о реально крупных компаниях (amazon, google...) там как раз предпочитают python из-за выше упомянутой простоты интеграции нейросетей, а java из-за стабильной поддержки сверх высоких нагрузок.

    Меньше слушайте диванных экспертов, пхп предрекают смерть с 00-х годов, что то он слишком долго дергается для мертвеца.
    Ответ написан
    1 комментарий
  • В каком классе писать логику столкновений двух объектов?

    hack504
    @hack504
    Нигде. В парадигме ООП и снежинка и варежка и сцена - описывают только свое поведение методами и свойствами. Введите ещё одну абстракцию - мир(или физика), которая содержит все эти объекты и описывает поведение их взаимодействия.
    Сцена детектит столкновение снежинкой и варяжкой - передает миру, а тот в свою очередь удаляет снежинку, запускает анимацию варяжке, запускает в сцене радостный звуковой щелчок.
    Таким образом, если в дальнейшем реализовывать дополнение "Грачи прилетели", то легко реализуется логика столкновения варяжки и помета => помёт остается, варяжка замирает, в сцене грустный звук "ооу"
    Ответ написан
    Комментировать
  • Как разобраться с сессиями и массивами в php?

    @gomer1726
    Чтобы записать что то в сессию, массив сессии должен стоять первым, то есть смотри ты делаешь так
    $nf = $_SESSION['number_flight'];
    А чтобы что то записать в сессию нужно так
    //Будем надеяться что переменная $nf что нибудь содержит
    $_SESSION['number_flight'] = $nf;
    Ответ написан
    Комментировать
  • Как вы учитесь и ищете чужие исходники?

    @v_m_smith
    лучше бы я пил и курил
    выбираешь любимый open source проект на Github, изучаешь его код, читаешь issues и начинаешь контрибутить.
    Ответ написан
    Комментировать
  • Пожалуйста оцените мое убогое ООП?

    Stasgar
    @Stasgar
    Обученная макака
    Во-первых: начните изучать архитектурную часть программирования, изучите паттерны проектирования, изучите SOLID, DRY, KISS и остальные модные словечки, постарайтесь всё это осознать, или, на крайняк - зазубрить. Всё придет с опытом, изначально все не понимали зачем всё так сложно, но эта сложность обусловлена неисчислимыми литрами слёз и потраченных нервов, всё не просто так.

    Судя по всему это тестовое или учебное задание. От вас требовалось отоверинжинирить простую задачу. Давайте попробуем:

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

    Разобъем задачу на отдельные независимые этапы:
    1) Преобразование одной структуры данных (текстового файла) в другую (объект, понятный PHP, к примеру)
    2) Преобразование этой структуры данных в Json формат.
    Первый вопрос, который может возникнуть - почему сразу не преобразовать в json? Ответ - при расширении системы в будущем - нам понадобится вывести данные в виде массива, или в виде XML, или даже в виде готового файла Excel. Нам будет сложно дополнять логику изначального класса, ничего при этом не сломав и не затронув уже существующий функционал. Также ответом на этот вопрос может являться каждая буква из SOLID принципов, подробнее отвечу дальше, когда буду пояснять за реализацию, см. ниже

    Теперь рассмотрим эту задачу с точки зрения ООП, начнем думать не от конкретной реализации, а от интерфейса и абстракции (мы не парсим конкретный файл, мы парсим просто файл, мы не переводим его в конкретное представление json, мы переводим его просто в представление):
    Нам понадобится 2 класса - непосредственно класс, читающий файл и преобразующий его в простейший тип данных (например PHP array). Второй класс - преобразователь простейшего типа данных парсера в какой-то определенный тип:
    1. LogFileReaded implements/extends FileReaderContract(интерфейс, возможно абстрактный класс, если понадобится предустановленная логика)

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

    2. JsonPresenter implements/extends DataTypePresenterContract

      Абстракция содержит контракт на метод output(), а в конструкторе принимются исходные данные. В конкретной реализации JsonPresenter в output() будет банальный json_encode() (да, это нормально, нет, класс не лишний и нет, json_encode() нельзя пихать в сам парсер) А теперь к вопросу - почему не следует просто запихать это всё в парсер и вместо массива отдать json: в будущем, когда система будет расширяться - нам понадобится представить данные в виде XML - что тогда будем делать - переписывать весь код парсера ради добавления switch case "json" и т.д.? А если что-то сломается во всей системе? А если вариантов представления станет настолько много, что файл будет просто не читаем? А при данном подходе достаточно будет просто написать новый класс XMLPresenter, или даже ExcelPresenter, который на выводе не строку будет выдавать, а целый файл (опустим типизацию output пока)). Также этот класс можно реализовать в виде декоратора (паттерн), да и много еще как.



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

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

    P.S. В данной реализации опускаются и упрощаются некоторые моменты для понятности
    Ответ написан
    21 комментарий
  • Как защититься от sql иньекции?

    kylt_lichnosti
    @kylt_lichnosti
    Учитывая, что оно у вас сохранилось в базу, а не выполнилось - там уже какая то защита есть.
    А если по делу, то используйте prepared statements и PDO.
    Ответ написан
    4 комментария
  • Как построить инфраструктуру большого проекта?

    Ranwise
    @Ranwise
    почитайте The System Design Primer, там есть некоторые примеры архитектуры приложений
    Ответ написан
    Комментировать
  • Как построить инфраструктуру большого проекта?

    DexterHD
    @DexterHD
    Software Engineer, Teamlead, CTO
    Для начала изучите принципы приложения 12 факторов: https://12factor.net/ru/ Эти рекомендации позволяют создавать приложения которые легко и просто масштабируются, как горизонтально, так и вертикально.
    После можете посетить хороший ресурс со статьями на тему высоких нагрузок: https://ruhighload.com/
    Ответ написан
    2 комментария
  • Сколько времени уделять на общение с клиентом? Как поддерживать связь?

    @semki096
    Мой опыт (9 лет на fl) - только переписка в скайпе. Иногда (очень редко) - первый разговор вживую, дальше только переписка.

    99% клиентов-говорунов по факту являются не очень качественными заказчиками, поэтому предпочитаю упустить 1% при этом сэкономить кучу времени.
    Ответ написан
    2 комментария
  • Этап подготовки к разработке сайта. Когда оценивать бюджет и заключать договор?

    @lotse8
    1) Сразу не вникая очень глубоко на основе предыдущего опыта можно назвать заказчику примерные рамки цены от ... и до ... и если заказчика этот диапазон устроит, то можно продолжать разговор. Некоторые на этом этапе отваливаются, это воздухогоны, у которых денег нет, а ходят по базару и просто прицениваются. Или же спрашивать у заказчика бюджет проекта, на какую сумму он рассчитывает, тогда думать только в пределах бюджета.
    Т.е. смысл в том, чтобы на самом первом этапе отсеять все пустышки, чтобы не тратить на них свое время.
    2) Для тех кто не отказался, нужно делать бриф и список функций или модулей и считать уже более точно ценник. На этом этапе можно договариваться с заказчиком Цена +/- 10% на непредвиденные ситуации. Обычно здравомыслящие заказчики понимают, что проект оценить на старте до копеек невозможно. Уже можно делать договор и просить предоплату.
    3) И когда уже все будет до мелочей расписано, тогда уже можно смотреть, и если сильно ошиблись не в свою пользу, то либо разговаривать с заказчиком и менять цену (доп. соглашение к договору), либо отказаться (в договор надо забить пункт для варианта отступления).

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

    @Mercury13
    Программист на «си с крестами» и не только
    У генератора псевдослучайных чисел есть такое понятие, как «случайная затравка» (random seed). Затравку берут из истинно случайных мест вроде счётчика тактов процессора. Достаточно сохранить затравку — и последующие запуски генератора дадут те же результаты.

    Допустим, манипуляции с затравкой есть вот тут.
    php.net/manual/ru/function.mt-srand.php
    Ответ написан
    Комментировать
  • Основные мероприятия по переводу на HighLoad?

    Wott
    @Wott
    HL это на самом деле задача по оптимизации. В первую очередь надо уменьшить времена формирования ответа, времена загрузки на клиенте, что достигается оптимизацией самого приложения (профилирование, склеивания запросов и разнесения контента) и и потом уже кеширования, которое бывает разное — тупое (ставим nginx ) или структурное ( разбиваем на блоки, которые формируем и кладем например в memcached ), управляемое ( содержимое меняется при необходимости ) и нет ( по таймауту ). Для кеширования может понадобиться изменять приложение ( обновления в данных ) или адаптировать кеширование ( сброс кеша или его игнорирование по кукам например )
    Дальше, если сервер уже не справляется в одиночку или надо HA, переходим к горизонтальному масштабированию. И начинать надо с того что запросы должны быть атомарными — любые состояния, типа сессий, усложнят масштабирование ( придется расшаривать сессии на кластер или привязывать пользователя к серверу по ip например, что легко если шардинг, но HA страдает ). Какая база ( SQL или NoSQL. не говоря уже об названии ) или кластер — зависит в первую очередь от приложения, а не от моды или комментов на хабре. Лучше жить на MySQL, тем более что Percona+Galera очень даже неплохи, если вы его хорошо знаете, чем окунаться в проблемы незнакомого сервера на production. Опять же конкретная технология должна решать конкретные проблемы, которые определяются, исходя из архитектуры приложения в первую очередь. Ну и пробовать, экспериментировать.
    Ответ написан
    8 комментариев