Задать вопрос
  • Почему защита от массового назначения работает не везде?

    v_decadence
    @v_decadence
    Потому что второй вариант вызывает update на всей выборке, а не на конкретной модели. В этом случае не сработает защита, события, мутаторы и прочие плюшки Eloquent
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

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

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

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

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Faker - как создать дерево категорий?

    mashletov
    @mashletov
    Math.random()
    Seeding БД с помощью factory & faker не особо подходят для случаев, когда надо учитывать предыдущие созданные записи. Проще вручную через цикл сделать, как по мне.
    Ответ написан
    Комментировать
  • Как изменить значения одного столбца при добавлении другого?

    @vanillathunder
    Создаёте наблюдатель
    class UserObserver
    {
      /**
       * Прослушивание события обновление вопроса
       *
       * @param  Question $question
       * @return void
       */
      public function updating(Question $question)
      {
           if ($question->body != $question->getOriginal('body ')) {
               $question->status = 'опубликован';
            }
      }
    }
    Ответ написан
    Комментировать
  • Как элегантно преобразовать дату?

    @kstyle
    конвертация в одну строку www.phptherightway.com/#date_and_time + справочник формата php.net/function.date
    Ответ написан
    Комментировать
  • Как запускать функцию строго в указанное время с точностью до минуты, при том что время лежит в базе и нагружать базу нельзя?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если один запрос в минуту из крона - это слишком большая нагрузка, то проблема у вас где-то в другом месте.
    Ответ написан
    Комментировать
  • Нужно создать сайт для учетеля физики, каую хорошую cms посоветуете,идеально бы чтоб ещё и шаблон подходящий был?

    webinar
    @webinar Куратор тега PHP
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Что бы советовать cms надо знать не для кого, а что там будет. Какие модули, какая информация и т.д. Нужна ли авторизация, интеграция с соц сетями и т.д.
    Я так понимаю, люди которые Вам что-то посоветовали, слабо представляют, что такое веб разработка.
    Возможно нужен модуль для удобного редактирования формул в визуальном редакторе? Может еще что. Вы краткое тех задание составьте, а потом просите совета.
    Ответ написан
    Комментировать
  • Курсы для освоения программирования?

    @SergeyZelensky-Rostov
    Бросить этим заниматься, если ты не можешь сам этим заниматься, навряд ли какие нибудь курсы помогут, нет волшебных курсов которые прошел, и сразу работать начал, как минимум год работы непрерывной, каждодневной, можно чередовать различные языки(например раз в 2 дня) , и вот тогда уже можно задуматься о работе, я устроился на первую работу через год , и думал что хорошо знаю phpразбираюсь, но нет, огромное количество знаний приходит с опытом, может ты буксуешь по тому что хватаешь не те куски информации, и понимание этой информации пока не доступно из-за отсутствия опыта, расскажи на чем конкретно буксуешь, что не понятно?
    Ответ написан
    Комментировать
  • Почему правильнее делать сайт по mvc?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    У вас может быть и модель, и прдставление и контроллер хоть в одном файле, суть то не в этом.

    MVC описывает не все приложение (есть Model2 которое убого но описывает все приложение, но я бы не рекомендовал вам сейчас на него ориентироваться). Оно описывает только "как сделать так, что бы приложение ничего не знало о UI".

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

    Далее, у нас есть представление. Вопреки вашему мнению, представление это не html а http. Поскольку PHP должен сформировать именно HTTP ответ (так или иначе, при помощи echo и header или при помощи абстракций над http). Просто обычно сайтики в качестве тела ответа содержат html. Но намного проще воспринимать "представление" как HTTP ответ. "шаблонизаторы" в этом плане не относятся к представлению, это способ его генерации. Сделаем допущение что весь view в нашем MVC это обычный HTTP ответ. Просто кусок текстовой инфы выплюнутый в буфер вывода. Помимо HTTP есть еще варианты: CLI или консольные скрипты, у них сфой формат представления. А еще есть менеджеры очередей и кучи других вариантов.

    Так же есть еще HTTP запросы, которые по сути являются частью представления, а точнее может восприниматься как какое-то действие пользователя. Причем под пользователем я подразумеваю не обязательно живого человека, а все что угодно, что может отправлять запросы. Браузеры, боты, краулеры, ваше же приложение.

    Ранее мы уже сказали что "шаблонизаторы" это не часть представления а только способ его получения. Где мы должны использовать шаблонизатор тогда? Как сделать так, что бы наша "модель" или точнее наше приложение ничего не знало об этом "шаблонизаторе" (или сериалайзере, или json_encode, или еще чем-то там)? Положим между представлением и моделью что-то промежуточное - контроллер.

    Опять же контроллер - это не обязательно один объект. Это может быть целая цепочка объектов, которая может передавать запросы друг дружке и что-то с ними делать. Например один "контроллер" глянет мол "ага, он в качестве тела запроса прислал json - десериализуем". А второй контроллер такой "ага, он должен быть авторизован - надо проверить". Ну и т.д. покуда мы не дойдем до последнего контроллера в цепочке, который уже будет дергать "один" метод модельки. Это слой адаптеров между http и нашим приложением. Вот ключевая мысль MVC на бэкэнде (или ели точнее Mediating controller MVC или MVA, паттерн который реализован в большинстве современных бэкэнд фреймворков).

    Зачем нужно отделять UI от приложения? потому что что-то из этого явно меняться будет чаще и не одинаково. А еще можно распаралелить работу. А еще можно заменить реализацию одной из частей без вреда для другой. Словом мы получаем намного больше гибкости, но только если приложение ничего не знает о представлении.. В противном случае мы получаем антипаттерн под названием smart ui, для борьбы с которым 40 лет назад и придумывали MVC.
    Ответ написан
    3 комментария
  • Usb 3.0 видеокарта. Кто использовал?

    А как вариант с Miracast? Или Wi-Fi Display.
    И конфликтов быть не должно.
    Там же на али есть много неплохих вариантов адаптеров
    Ответ написан
    2 комментария
  • Доброй ночи,как создать свою IDE?

    @VZVZ
    Reverse-Engineer, Software Developer, Architect
    > вообщем,чтобы можно было делать GUI на PHP
    Об этом можно много писать. Это как раз-таки достаточно просто.
    1. Пишем на PHP свой фреймворк со средствами для GUI и т.д., просто чтобы можно было написать скрипт, который бы скажем открывал окошко, копировал файл и т.д., если его запустить с помощью php.exe
    В принципе, для довольно-таки многого в PHP уже есть средства, остается только написать для них удобные обертки, т.е. собственно фреймворк.
    2. Пишем упаковщик этого дела в exe: скрипт упаковывается вместе с php.exe, или еще как-то так.
    3. Пишем IDE с WYSIWYG и прочими фичами, для того, чтобы удобнее было писать код под этот фреймворк.
    Собственно, всё.

    > со своими возможностями,плюсами сделать.
    Ага, я уже представляю, какие это плюсы получатся, с вашим "вообщем", с вашими запятыми без пробелов, а то и вовсе грубо пропущенными запятыми...
    "Ты родной язык не знаешь, как тебе освоить язык программирования?" (c) Я
    Вы как хотите, а нам - не надо таких плюсов больше:
    demotivation.me.prxs.ru/images/20130408/kjzco6f2cy...
    Devel Studio - это полное УГ, поэтому надо делать не "что-то типа Devel Studio", а скорее что-то типа Visual Studio. Но, во-первых, VS тоже нужно копировать не целиком и полностью, а только удачные из нее решения, а некоторые другие решения взять из других продуктов, которые сперва надо освоить на особом уровне. Во-вторых, чтобы взять удачные решения даже из той же VS, все равно нужно сравнить ее хоть с чем-то, иначе вы многого просто не увидите и не поймете.
    Ибо большинство уникальных решений остается не сплагиаченным не потому что патент, а потому что нубы просто не осознают всю их уникальность и даже не пытаются подражать. Вот тупые люди даже не понимают, что если в винде кнопки "OK - Cancel" везде располагаются именно в таком порядке, то и у себя надо делать "OK - Cancel", а не "Cancel - OK" или еще как-то через задницу.
    Говорю как реверс-инженер - специалист по промышленному шпионажу.

    Ну да ладно, это все цветочки.
    Вы главное подумайте: а как вы сделаете подобие того, что в VS называется IntelliSense?
    Ну там всплывающие подсказки, или скажем чтобы скобочки подсвечивались: подводишь курсор к закрывающей скобке - умный алгоритм ищет открывающую и подсвечивает, или наоборот.
    Вот интересно, а как вы собираетесь это делать?
    Надеетесь на готовые решения? Или вы считаете, что нужно писать свой алгоритм разбора кода? А вы пробовали написать такой алгоритм хотя бы для какого-нибудь JSON или еще чего-то примитивного?
    Или вы не согласитесь со мной, что это основа любой IDE, и без WYSIWYG еще возможно что-то путное сделать (пример: JetBrains), а вот без умного разбора кода - вообще ничего, и даже VS без этого уже была бы не VS?

    > Я знаю C#
    Пардон, какой C#, когда PHP?
    Вы видели хоть одну удачную IDE, которая была бы написана не на том языке, не на том фреймворке, для которого она предназначена?
    Вот и я что-то не припомню. Кстати, даже автор Devel Studio вроде бы понял это.

    И еще, а почему именно PHP?
    Что в нем хорошего?
    Я бы еще подумал, что выбрать - PHP, или NodeJS (у JS-то синтаксис поудобнее будет), а может Ruby, а может для Python наконец написать что-то нормальное, а может еще что.
    Много экспериментировал бы. А не то что - от балды: в моей новой IDE будет PHP и точка.

    КОРОЧЕ, вывод такой:
    - если вам нужны плюшки в виде библиотек - возьмите нормальную платформу (такую, как .NET) и пишите для нее свои плюшки в виде библиотек;
    - если вам нужны плюшки именно в виде фич IDE - возьмите нормальную IDE (такую, как VS) и пишите для нее свои плагины (создавая плагины, вы заодно изучите чужие IDE изнутри);
    Этим может и будет кто-то пользоваться. Хотя,воооооообщем-то,тоже вряд ли.
    А вашей принципиально новой IDE, которую вы напишете сами, без команды спецов и без учета всех вышеупомянутых замечаний, 99,(9)% никто не будет пользоваться всерьез.
    Нужно же все-таки как-то понимать, что чем крупнее, масштабнее и ответственнее проект, тем больше надо скиллов. И осознавать свои скиллы в соответствии с реальными достижениями - т.е. не завышать и не занижать ЧСВ.

    P.S. Ну или я м***к. Извините, если обидел. Просто делюсь своим опытом.
    Ответ написан
    2 комментария
  • Как протестировать метод, работа которого зависит от настроек интернета на устройстве?

    newross
    @newross
    Product owner
    Также, как во всех других случаях: выделить интерфейс для получения настроек и дальше через мок подставлять их в юнит тесте.
    Ответ написан
    Комментировать
  • Silverlight умер?

    @dmitryKovalskiy
    программист средней руки
    Он в интенсивной терапии , в критическом состоянии. А в соседней палате лежит Flash
    Ответ написан
    3 комментария
  • Как связать Gitlab CI и проекты Visual Studio?

    bstdman
    @bstdman Автор вопроса
    Desktop разработчик
    Отвечу сам себе, вот пример job script для построения Release и Debug конфигураций, с восстановлением пакетов из Nuget (e3Shell.Extensions.sln - имя файла решения):

    git submodule update --init
    ls -la
    
    echo "Restoring NuGet Packages..."
    "c:\nuget\nuget.exe" restore "e3Shell.Extensions.sln"
    
    echo "Debug build..."
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe /consoleloggerparameters:ErrorsOnly /maxcpucount /nologo /property:Configuration=Debug /verbosity:quiet "e3Shell.Extensions.sln"
    
    echo "Release build..."
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe /consoleloggerparameters:ErrorsOnly /maxcpucount /nologo /property:Configuration=Release /verbosity:quiet "e3Shell.Extensions.sln"
    
    echo "Build success."


    Update 27.10.15: для новых версий Gitlab (начиная с версии 7.12) в репозитории создается файл .gitlab-ci.yml со следующим содержимым:
    stages:
      - build
    
    job:
      stage: build
      script:
      - git submodule update --init
      - ls -la
      - ''
      - echo "Restoring NuGet Packages..."
      - '"c:\nuget\nuget.exe" restore "TerminalClone.sln"'
      - ''
      - echo "Debug build..."
      - C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe /consoleloggerparameters:ErrorsOnly
        /maxcpucount /nologo /property:Configuration=Debug /verbosity:quiet "TerminalClone.sln"
      - ''
      - echo "Release build..."
      - C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe /consoleloggerparameters:ErrorsOnly
        /maxcpucount /nologo /property:Configuration=Release /verbosity:quiet "TerminalClone.sln"
      - ''
      - echo "Build success."
      tags: 
      except:
      - tags
    Ответ написан
    Комментировать
  • Как вы управляете своей базой знаний? Какие инструменты для этого используете?

    @andrew011010
    Front-end разработчик
    Использую такую связку:
    1. Evernote
    2. Xmind
    3. Google Drive (+ Google Docs)
    4. Quizlet
    5. Бумажный блокнот
    6. Закладки браузера

    Evernote
    1. Материалы по категориям. К сожалению, в Evernote ограничена глубина вложенности, есть только Блокноты и Наборы блокнотов, но можно обойтись и этим. Наборы использую для общих категорий (например: Frontend). В рамках каждой категории определяю блокноты-подкатегории (Например, для Frontend: CSS, JS, node.js, Оптимизация, ...). В каждом блокноте выделяю темы, куда собираю ссылки с описаниями. Здесь же можно проводить сравнительный анализ, категоризацию, вести список вопросов, идей для экспериментов/проектов и т.п.
    2. Списки книг, фильмов, вариантов подарков, мест, средне-долгосрочные to-do и тд.
    3. Ежедневник, цели, планы.

    Xmind
    Mindmap здорово помогает описать предметную область, структуру книги, список книг по направлению в разрезе тем и тд.

    Google Drive
    Хранение книг. К проработанным книгам прилагается mindmap и/или конспект (docx или Google Docs). Возможна совместная работа, доступен простой шэринг.

    Quizlet
    Карточки для закрепления знаний в особо важных темах/областях. Тоже возможна совместная работа и шэринг.

    Бумажный блокнот
    Для задач на день, записей и пометок в течение дня. Вечером, то, что необходимо, переносится в Evernote. Можно и сразу в Evernote, но мне так комфортней.

    Закладки браузера
    1. Любимые источники по областям (Web, Новости, Город, Наука, ...)
    2. Папка с подпапками-темами, не требующими глубокого знания, но представляющими интерес (Музыка, Бег, История, ...)
    3. Папка для сохранения интересных материалов в течение недели, которые в конце недели либо перечитываются и удаляются, либо отправляются в хранилище.
    Ответ написан
    Комментировать
  • Есть ли какой то шаблонизатор для C#?

    @Nubzilo Автор вопроса
    Изучаю C#
    Всем спасибо за провильную наводку...Гуглил не по тем запросам )
    Меня целиком устроил DotLiquid
    Ответ написан
    Комментировать
  • В чем существенная разница между Button.Click и Button.Command и что лучше использовать?

    @AlexP11223
    Ну в WPF популярно использование паттерна MVVM, потому часто используют Binding к данным и командам (из ViewModel) вместо code behind в самом View (Window.xaml.cs).

    И у команды, например, удобно, что есть CanExecute, где легко можно задать условия включения кнопки.
    Ответ написан
    Комментировать
  • Cервис онлайн для рисования блок-схем?

    Absent
    @Absent
    draw.io — бесплатный и интегрируется с Google Drive (создает гугл-доки, которые потом открываются в этом сервисе)
    Ответ написан
    6 комментариев