Ответы пользователя по тегу PHP
  • Модульность php-приложения (на примере интернет-магазина)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В то же время ни Order, ни Payment не могут работать без Cart

    То есть у вас возникает циклическая зависимость Order и Cart? я так понимаю?

    Вообще Order, Cart и Payment можно объеденить в один модуль, который задает базовые интерфейсы + тыща модулей с реализацией интерфейсов. Типа CardPayment и т.д. Словом нужно избавляться от циклических зависимостей и думать о кейсах когда с чем будет работать. Скажем Cart без Order не имеет смысла, а вот Order без Payment - имеет.

    Или же тема оформления не поддерживает нужный модуль.

    Хорошая идея - тема должна содержать метаданные о том какие модули оно поддерживает а какие нет. + идея с виджетами.

    Возможно ли это? Если не полная, то хотя бы слабая зависимость модулей друг от друга?

    Более чем, просто придется дробить систему не на такие вот модули а на отдельные компоненты, во всю использовать принципы единой ответственности, сегрегации интерфейсов и инверсии зависимостей.... короче убьете вы много времени но это возможно.

    Стоит ли оно того?

    Увы вы один не сможете написать и поддерживать такую систему. Многие пытались и даже есть парочка неплохих вариантов ( sylius.org например ), но в одиночку за приемлимое время - маловероятно.

    Какие есть пути уменьшения зависимости модулей друг от друга?

    Доменные события это к слову неплохой вариант уменьшения связанности, можно рассматривать как вариант. Но в целом должно хватать соблюдение принципов SOLID и более рациональное дробление функционала, поиск общих зависимостей и тд. Сегрегация интерфейсов + Инверсия зависимостей.
    Ответ написан
    Комментировать
  • Как привести число к double?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    это не double а простое форматирование чисел. Делается через printf/sprintf

    echo sprintf('%.2f', 1.5);
    Ответ написан
    Комментировать
  • Возможно ли PHP програмисту написать на PHP мобильное приложение?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    На PHP - нет. Увы (или к счастью) - все проекты по реализации биндингов UI андроида или ios к пыху провалились. Есть конечно вариант каким-то образом завернуть PHP в APK или собрать для iOS (это возможно), написать примитивное нативное приложение в webview и рендрить html но...

    Я думаю быстрее будет освоить java или objective-c чем реализовать более-менее вменяемое приложение на PHP.

    В целом альтернатива для web разработчиков - cordova + ionic.
    Ответ написан
    4 комментария
  • Виновен ли я в самописном движке?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    с одной стороны SEO-ник не прав, так как.. ну это очень глупое утверждение

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

    То есть притензия SEO-ника возможно была связана с тем что:

    - нет сайтмэпа и нет средств для генерации, а так как это не вордпресс просто поставить плагин не выйдет
    - возможно нет возможности задавать всю эту SEO лабуду вроде метаинформации и т.д.
    - все в таком духе. Любое "допиливание" клиенту теперь обойдется в солидную сумму.

    Мораль: эксперементы в свободное время, набирайтесь опыта. Старайтесь использовать готовые решения. Помимо wordpress есть масса небольших и удобных CMS с базовыми штуками которые нужны SEOникам и удобны в допиливании программистами.
    Ответ написан
    4 комментария
  • Сервис конвертации видео с API?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    заморачивать с FFMPEG тем более нужно организовывать очередь конвертации...

    Для видеохостинга это выйдет сильно дешевле. Но на первое время можно заюзано

    https://aws.amazon.com/elastictranscoder/
    Ответ написан
    1 комментарий
  • Как реализовать множество условий?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Итак... возьмем ваш код

    if (!preg_match("/^[a-zA-Z0-9_]+$/", $username)) die("Bad login");
            if (
            $type != 'voice' and $type != 'balance1' and $type != 'balance2' and $type != 'absvoice' and $type != 'passhash' and
            $type != 'paytime' and $type != 'white1' and $type != 'exp1' and $type != 'white2' and $type != 'voice2' and
            $type != 'exp2') die("Wrong type");
            if ($action != 'set' and $action != 'get' and $action != 'add') die("Wrong action");
            if ($action == 'set' and !(preg_match("/^[0-9-.]+$/", $value)) and $type != 'passhash') die("Wrong value");
            if (($action == 'set' or $action == 'add') and ($type == 'paytime' OR $type == 'absvoice')) die("paytime/absvoice read only");
            if (($action == 'add') and ($type == 'passhash' or $type == 'white1' or $type == 'white2')) die("add not available for this");


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

    if (!preg_match("/^[a-zA-Z0-9_]+$/", $username)) die("Bad login");
    
    $availableTypes = ['voice', 'balance1', 'balance2', 'absvoice', 'passhash', 'paytime', 'white1', 'exp1', 'white2', 'voice2', 'exp2'];
    if (!in_array($type, $availableTypes)) {
        die("Wrong type");
    }
    
    if (!in_array($action, ['set', 'get', 'add'])) {
        die("Wrong action");
    }
    if ($action == 'set' and !(preg_match("/^[0-9-.]+$/", $value)) and $type != 'passhash') {
        die("Wrong value");
    }
    if (($action == 'set' or $action == 'add') and in_array($type, ['paytime', 'absvoice'])) {
        die("paytime/absvoice read only");
    }
    if (($action == 'add') and (in_array($type, ['passhash', 'white1', 'white2']))) {
        die("add not available for this");
    }


    теперь мы могли бы и успокоиться, так как далее у нас есть различия в том что происходит по условиям. А значит дублирования как такового дальше нет.

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

    updated: избавляемся от всех ифов (точнее заменяем на один)
    $constraints = [
        'unsupportedTypes' => !in_array($type, $availableTypes),
        'unsupportedAction' => !in_array($action, ['set', 'get', 'add']),
        'expectedNumericValue' => $action == 'set' && is_numeric($value),
        'readOnlyType' => 'get' !== $action && in_array($type, ['paytime', 'absvoice']),
        'disallowedTypes' => 'add' === $action && in_array($type, ['passhash', 'white1', 'white2']),
    ];
    
    $constraintsMessages = [
        'unsupportedTypes' => 'Type "<type>" is not supported',
        'unsupportedAction' => 'Action "<action>" is not supported',
        'expectedNumericValue' => 'Wrong value, expected numeric',
        'readOnlyType' => '<type> is read only',
        'disallowedTypes' => 'Type "<type>" is not supported for action "<action>"'
    ];
    
    $errors = array_keys(array_filter($constraints));
    if (!empty($errors)) {
    
        die(str_replace(
            ['<type>', '<action>'],
            [$type, $action],
            $constraintsMessages[reset($errors)]
        ));
    }


    это дело можно еще упростить и соорудить нормальные правила валидации + отдельную функцию которая будет проверять все это дело.
    Ответ написан
    2 комментария
  • Как правильно сделать/доработать router для MVC?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Может все же написать статью "что такое MVC"... а то народ путается....

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

    view в контексте сервера не должен дергать контроллер (да и вообще он о контроллере знать ничего не знает). Ну то есть это не тот ж view что у нас модельку дергает. Это какой-то другой view, или представление запроса, инпуты и кнопочки. http запрос.

    Только одна стрелочка правильная - что контроллер просит модель изменить состояние.

    Так, отвлекся я чойто...

    Возьмите любой готовый роутер, не пишите свой, это пустое.
    Ответ написан
    4 комментария
  • Вопрос по кукам и сессиям в php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Чем куки отличаются от сессии в PHP?

    в дополнение:
    - сессии просто можно хранить в базе и тогда хэндлинг сессий это ваша забота. Это удобно когда у нас несколько серверов и балансировщик раскидывает нас на разные сервера, тогда у нас есть единый центр сессий например. Для этих же целей можно использовать memcache или redis.
    - сессии не обязательно умирают после закрытия браузера
    Ответ написан
    4 комментария
  • Как использовать namespace внутри метода?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    protected function _methodName()
    {
        $connection = new \Abraham\TwitterOAuth\TwitterOAuth\TwitterOAuth(
             CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_SECRET
         );
    }


    ну и да, избавляемся от этого инклуда и выносим это в наш базовый автозагрузчик.
    Ответ написан
    Комментировать
  • Как спроектировать систему геолокации и сохранение?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Использую MVC

    Ну ок, и причем тут это?

    координаты в токене

    используете JWT?

    если не совпали, то перезаписывать координаты в токене..

    А смысл тогда вообще связывать координаты и токен? Не проще ли обновлять периодически координаты для сессии?

    Словом если у вас это нужно для геотрекинга - то просто отделите токен от геолокации пользователя и используйте отдельный метод api для апдейта оных.
    Ответ написан
  • Как отправить письмо при помощи smtp?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    swiftmailer.org

    хватит писать велосипеды.
    Ответ написан
    Комментировать
  • Как сделать раздвоение цветов в php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    в смысле... взять синий и красный каналы и чуть чуть их подвигать?
    Ответ написан
  • Для чего существует $_REQUEST?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    POST/GET нужны как раз таки что бы узнать как были переданы эти данные. А REQUEST - когда нам пофигу.

    В целом рекомендую никогда не использовать все эти вещи и вооружиться HttpKernel или PSR7
    Ответ написан
    1 комментарий
  • Как подружить объектый подход взаимодействия с БД и ресурсоёмкую аналитику?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    CQRS, DataMapper на запись (легко поддерживать, относительно медленно на запись и чтение, очень медленно со сложными запросами), агрегации данных на чтение (легко поддерживать, быстро на чтение)
    Ответ написан
    Комментировать
  • Нужна помощь с регуляркой php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ненадо парсить html регурярками, и все будет намного проще. Есть SimpleXML и другие API для работы с DOM.
    Ответ написан
    4 комментария
  • Как сравнить две строки, имеющие разный символьный состав?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как их можно сравнить?

    взять код символа.
    Ответ написан
  • Как удалить запятую в конце строки?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    rtrim

    updated

    указали бы что для какого языка надо. По тегам не сильно легко догадаться можно. Вам нужен TrimRight
    Ответ написан
  • Нужно ли оборачивать lastInsertId() в транзакцию?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вообще по хорошему все должно быть завернуто в транзакцию (минимум одна транзакция на HTTP запрос).

    Шансы что lastInsertId бросит исключение примерно равны нулю, но у вас же не один запрос обычно?
    Ответ написан
    3 комментария
  • Какой фреймворк подойдет больше для данной ситуации?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Не могу решится что выбрать symfony или laravel.

    Для CRUD-а, если на сервере не будет ровным счетом никакой бизнес логики, лучше возьмите laravel, быстрее сделаете.

    от фрейма требуется только работа с базой и частичная валидация, кэширование, работа сессиями.

    А еще предоставление нормальной платформы для организации HTTP API но это мелочи да.

    Думаю что больше редис.

    redis универсальнее, но сложнее. В принципе тупо как key-value разница не существенна.

    Если есть возможность работать с вебсокетом, то будет хорошо, а если нет, то ajax.

    ajax (или XmlHttpRequest) это просто возможность делать HTTP запросы из браузера. То есть это поддерживают по дефолту все существующие фреймворки ориентированные на HTTP.

    Что до websockets - тут вам придется всеравно делать отдельное приложение, можно на пыхе но дешевле и проще взять node.js + socket-io. Причем не обязательно при этом все писать на node.js. Ваша апишка может быть реализована на PHP, и через очередь сообщений (redis умеет pub/sub и mq) просить другое приложение (простенькое на node.js + socket.io) отправить пользователям сообщения.

    Для авторизации в этом случае рекомендую JWT, так как тогда не нужно будет node.js-у стучаться в php приложение для подтверждения авторизации. Достаточно проверить сигнаруру токена и достать данных из оного. Опять же куча готовых решений как для symfony, так и для laravel и для socket-io.

    Ну и да, если у вас реально сервер нужен только в качестве клиента для базы данных + валидация - рассмотрите вариант использования инструментов типа loopback.io и прочего.
    Ответ написан
    6 комментариев
  • Возможно ли через php структуризировать html код?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ответ написан
    Комментировать