• Какую взять ORM для своего проекта?

    @D3lphi
    Возьмем ORM из двух популярных PHP-фреймворков. Первая будет Eloquent ("Родная" для фреймворка Laravel), а вторая - Doctrine (Одна из доступных ORM в фреймворке Symfony). Кардинальным отличием этих двух "систем" является то, что первая разработана на основе паттерна Active Record, а вторая - с использованием паттерна Data mapper. Чем же они отличаются? Приведу абстрактные примеры кода для первого и второго паттерна:

    Active Record:
    $user = new User(); // Создаем "сущность" нового пользователя.
    $user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
    $user->password = '123456'; // Устанавливаем пароль этому пользователю.
    $user->save(); // Сохраняем пользователя.


    Все, новый пользователь создан и находится в базе данных. Теперь, Data mapper:
    $user = new User();
    $user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
    $user->password = '123456'; // Устанавливаем пароль этому пользователю.
    
    $manager = ... // получаем объект менеджера (Например, из DI контейнера).
    $manager->persist($user); // "Скармливаем" новоиспеченного пользователя нашему менеджеру.
    // $manager->persis($user1); // Мы можем создать еще одного пользователя и уведомить менеджер об этом.
    // $manager->persis($user2); // И еще одного...
    $manager->flush(); // После выполнения этого метода данные отправятся в базу данных.


    Очевидно, первый способ куда проще. Но не все так просто. Дело в том, что паттерн Active Record нарушает принцип единственной ответственности (Single responsibility SOLID). И поэтому, в какой-то степени, может считаться антипаттерном. (Но это ни в коем случае не значит, что его не нужно использовать, для большинства проектов "хватит" за глаза). Наша сущность пользователя делает слишком много. Она не только представляет данные, но и еще работает с ними. В больших проектах это может усложнить поддержку кода. Data mapper, напротив же, разделяет представление данных в сущность (user) и работу с данными (manager, в данном примере. Также, за работу с данными отвечает репозиторий. Вы столкнетесь с ним, как только вам потребуется получить данные из БД (Doctrine)). В небольших проектах вы не заметите особой разницы. Разве что во втором случае увеличится количество классов. Так, в Eloquent вы создаете 1 модель, а в Doctrine - сущность и репозиторий.

    Все современные ORM включают в себя также, так называемые, query builder'ы. Они помогают отказаться от языка запросов, такого как SQL. Вы будете составлять запросы таким образом:
    $result = $qb
          ->select(['id', 'login'])
          ->where('id', '<>', 3)
          ->get();


    Собственно, query builder'ы помогают абстрагироваться от конкретной СУБД. То бишь, вы написали запрос 1 раз, а затем от того, какую СУБД вы используете будет зависеть выходной sql код. Генерация этого кода будет произведена абсолютно прозрачно для вас.

    Обе ORM имеют работать с отношениями. Вам нужно будет указать, как таблицы относятся друг к другу, а затем вы сможете удобно обращаться к связанным сущностям.

    Теперь конкретно. Так как вы только начинаете осваивать ORM, я бы порекомендовал начать с Eloquent. Она гораздо проще, чем Doctrine, да и более производительная, к тому же. Как освоите Eloquent, смело учитесь работать с Doctrine. Она обязательно должна быть "в копилке" ваших скиллов, так как является самой мощной в "мире" PHP.

    Успехов!
    Ответ написан
    2 комментария
  • Как получить список работающих php скриптов?

    @BorisKorobkov Куратор тега PHP
    Web developer
    cron:
    flock -w 3 /tmp/my_script.pid php /var/www/my_script.php
    Ответ написан
  • Как убрать точки из scandir()?

    @AlexanderZe
    Интересующийся
    $files = array_diff( scandir( $dir), array('..', '.'));
    Ответ написан
    Комментировать
  • Как проверить старость даты?

    NeiroNx
    @NeiroNx
    Программист
    $date = "01-01-2017";
    $diff = (new DateTime())->diff(new DateTime($date));     
        if($diff->m >= 6 || $diff->days >= 180) {
             echo "Дата старше 6 месяцев";
        } else {
             echo "Дата младше 6 месяцев";
        }

    или так
    $date = "01-01-2017";
       if(((new DateTime())->diff(new DateTime($date)))->m >= 6) {
             echo "Дата старше 6 месяцев";
        } else {
             echo "Дата младше 6 месяцев";
        }
    но тогда будет меньше года...
    Ответ написан
    Комментировать
  • Как лучше выводить строки с несколькими переменными?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    // 3-й вариант
    printf( "Format: %s. Config: %s. System (OS): %s.\n\n", 
      $format,
      $config->path,
      $os
    );


    А воообще, «вам шашечки, или ехать?!» и «работает – не трожь!»

    Пишите код, как вам лично кажется лучше, пока работает и пока не получили аргументированных возражений от коллег по коду.
    Ответ написан
    2 комментария
  • Где найти вариант тех. поддержки с возможностью обсуждения и предложений на сайт?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    оторый позволяет получить власть над соц сетями

    CH2i8hWUsAAUoDL.jpg
    Сервер сам написан на yii2

    CH2i8hWUsAAUoDL.jpg

    Я так понимаю нужно что-то типа:
    reformal.ru
    Хотя хз. Стоит ли что-то советовать человеку, который написал на yii сервер и подчинил соц сети.
    Ответ написан
    Комментировать
  • Как реализовать?

    bigton
    @bigton
    Web-программист
    Вот тут всё подробно расписано php.net
    Ответ написан
    1 комментарий
  • PHPUnit и генераторы?

    muhammad_97
    @muhammad_97
    PHP-разработчик
    Все потому, что yield вощвращает не значение, а класс Generator: php.net/manual/ru/class.generator.php
    Ответ написан
    1 комментарий
  • Php маршрутизация. Чем плох такой вариант?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вы не проверяете вставляемый роут, а что если я туда объект вместо строки влеплю? Если что-то влетело не так - бросайте исключение.

    Не используйте супер глобальные переменные. В начале создайте объект Request и уже с ним работайте.

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

    callable - это довольно специфическая хрень. Это может быть массив из двух строк, функция, объект со строкой, просто строка. Нахрен это дерьмо. Используйте тогда уже \Closure.

    Если у вас все равно регулярки всюду - имеет смысл использовать именованные последовательности:
    |(?P<id>\d+)|
    |(?P<name>[a-Z]+)|


    Замены паттернов имеет смысл делать при вставке роута, а не на момент диспатча.

    Форматирование...gqBbWeuzy9E.jpg
    Почитайте про PSR-2

    З.Ы. Когда наиграетесь - возьмите готовое и качественное в Symfony/Silex))
    Ответ написан
    Комментировать
  • Как сделать правильный редирект?

    Лучше всего прочитать документацию яндекс-кассы.
    Ответ написан
    1 комментарий
  • Zf2 classmap для vendor?

    Если используете композер, то можно воспользоваться опцией --optimize-autoload
    Если эта опция включена, то композер сам обойдёт директории и составил полную карту классов (в том числе и для тех пакетов, что находятся внутри папки vendor.
    На дев-машинах не рекомендую использовать оптимизированный классмеп (сложность в процессе разработки), а вот на стейдже и на проде --- самое оно.
    Ответ написан
    1 комментарий
  • Где новости про falcon?

    Acuna
    @Acuna
    Заполнил свой профиль
    Отложили из-за технических неполадок. Нечего пока писать, говоря проще.
    Ответ написан
    2 комментария
  • Где новости про falcon?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    в IRL новости тут например
    news.yahoo.com/spacex-delays-launch-ocean-landing-...

    или вы по типу Челленджера ждете?
    Ответ написан
    Комментировать
  • Чем отслеживать логи?

    toxicmt
    @toxicmt
    CTO at hexlet.io
    Первый вариант.
    Писать не только в лог, но и подключить https://rollbar.com/ . Эта штука решает очень много вопросов и особенно легко встраивается если у вас какой-то распостраненный фреймворк. Так же умеет собирать инфу из логов через https://github.com/rollbar/rollbar-agent

    Второй вариант.
    https://www.elastic.co/products/logstash Это стандарт в индустрии. Умеет читать из кучи источников (поддерживает как опрос так и пуши), так и может писать в кучу выходов. Внутри можно делать различный парсинг и обработку. Логстеш не единственный, гуглите по log collectors.

    Третий вариант.
    Использовать облачные сервисы сбора логов https://www.loggly.com или https://logentries.com/
    Ответ написан
    1 комментарий
  • Чем отслеживать логи?

    mikes
    @mikes
    zabbix nagios и тд и тп..
    мониторьте свои логи на предмет строк error, и получайте статистику графики уведомления и прочие полезные вещи
    Ответ написан
    Комментировать
  • Как сделать такую регулярку?

    Stalker_RED
    @Stalker_RED
    Вот: https://regex101.com/r/eH7uE9/1
    А сейчас вы скажете, что это не подходит, и начнете перечислять остальные условия задачи.
    Ответ написан
    Комментировать
  • Какие линтеры для PHP использовать в precommit hook?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ответ написан
    Комментировать
  • Бесполезный вопрос про print(), почему получается то что получается?

    @kapai69
    print не является "настоящей" функцией (это конструкция языка), поэтому заключать аргументы в скобки необязательно.

    Цитата из мануала.
    То есть он будет выводить все до точки с запятой, а не то что у него находится в скобках. Поэтому второе выражение будет выглядеть как
    $a = print "3" + 1; echo ++$a;
    Отсюда и результат.
    Ответ написан
    Комментировать
  • Как быстро загружать изменения на сервер при работе программиста?

    PhpStorm умеет подключаться к хранилищу на удаленном сервере.
    А вообще: лучше делать через систему контроля версий, внес исправления, протестировал, закоммитил, на сервере апнул - все счастливы.
    Ответ написан