Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос
Keanor

Ширшов Александр

Ведущий разработчик
  • 44
    вклад
  • 10
    вопросов
  • 105
    ответов
  • 26%
    решений
Лайки
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • Какую взять ORM для своего проекта?

    D3lphi @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 комментария
    Нравится 17 2 комментария
  • Как получить список работающих php скриптов?

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

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

    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 месяцев";
        }
    но тогда будет меньше года...
    Ответ написан более трёх лет назад
    Комментировать
    Нравится 1 Комментировать
  • Как лучше выводить строки с несколькими переменными?

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


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

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

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

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

    CH2i8hWUsAAUoDL.jpg

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

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

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

    index0h
    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))
    Ответ написан более трёх лет назад
    Комментировать
    Нравится 11 Комментировать
  • Как сделать правильный редирект?

    Андрей Евдокимов @Uncle_Stranger
    Лучше всего прочитать документацию яндекс-кассы.
    Ответ написан более трёх лет назад
    1 комментарий
    Нравится 2 1 комментарий
  • Zf2 classmap для vendor?

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

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

    dimonchik2013
    dimonchik2013 @dimonchik2013
    совет, который уже дан - ничего не стоит
    в IRL новости тут например
    news.yahoo.com/spacex-delays-launch-ocean-landing-...

    или вы по типу Челленджера ждете?
    Ответ написан более трёх лет назад
    Комментировать
    Нравится 1 Комментировать
  • Чем отслеживать логи?

    toxicmt
    Kirill Mokevnin @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 комментарий
    Нравится 5 1 комментарий
  • Чем отслеживать логи?

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

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

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

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

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

    OnYourLips
    OnYourLips @OnYourLips
    В первом случае все очевидно: 33.
    Во втором случае будет так: print(("3") + 1). Поэтому выведется 4. Потом 2 тоже очевидна.
    Ответ написан более трёх лет назад
    Комментировать
    Нравится 1 Комментировать
  • Как быстро загружать изменения на сервер при работе программиста?

    Андрей Мохов @mokhovcom
    PhpStorm умеет подключаться к хранилищу на удаленном сервере.
    А вообще: лучше делать через систему контроля версий, внес исправления, протестировал, закоммитил, на сервере апнул - все счастливы.
    Ответ написан более трёх лет назад
    12 комментариев
    Нравится 2 12 комментариев
Оценили как «Нравится»
  • 1
  • 2
  • Следующие →
Самые активные сегодня
  • Василий Банников
    • 13 ответов
    • 0 вопросов
  • hottabxp
    Сергей Карбивничий
    • 11 ответов
    • 0 вопросов
  • cicatrix
    • 9 ответов
    • 0 вопросов
  • dyuriev
    Денис Юрьев
    • 6 ответов
    • 0 вопросов
  • dimonchik2013
    dimonchik2013
    • 6 ответов
    • 0 вопросов
  • 0xD34F
    0xD34F
    • 6 ответов
    • 0 вопросов
  • © Habr
  • О сервисе
  • Обратная связь
  • Блог

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации