• Можно ли реализовать mvc без роутера?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Можно ли как-то избежать написания роутинга?

    только библиотеки

    https://github.com/auraphp/Aura.Router (пример работы)
    https://github.com/nikic/FastRoute
    Ответ написан
    1 комментарий
  • Как подключить oauth на сайт?

    Maksclub
    @Maksclub Куратор тега Веб-разработка
    maksfedorov.ru
    OAuth 2.0 Server
    язык PHP
    Ответ написан
    Комментировать
  • Как определить город по ip на cms opencart?

    Maksclub
    @Maksclub Куратор тега Веб-разработка
    maksfedorov.ru
    Город по IP-адресу

    Сделай сервис определения города, который и будет к АПИ обращаться просто через CURL или Guzzle
    Сделай простой контроллер, к которому из фронта будешь цепляться по аяксу, и значение в сессии держи
    Ответ написан
    Комментировать
  • Как правильно строить таблицу с товарами, на примере?

    Maksclub
    @Maksclub
    maksfedorov.ru
    1 вопрос. Но к примеру как быть с ценой товара, или с количеством товара? Вроде как можно писать в таблицу товара?

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

    Джинсы Левис (синие, мужские, Levis, 2019 года и прочее):
       - S (6 500 рублей, 10 штук)
       - L (6 500 рублей, 1 штука)
       - XXXL (6 500 рублей, 2 штуки)

    Отношения -- один ко многим

    То есть есть таблица товаров, есть таблица вариантов (размеров, цветов, офферов), есть таблица значений характеристик и есть таблица названий характеристик
    Ответ написан
    6 комментариев
  • Symfony, Doctrine, PostgreSQL. Как правильно организовать связи между сущностями?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Можно ли организовать доступ к полям сущностей так, как это было бы при наследовании, при этом храня общие поля в таблице Users (как это сейчас в базе и есть)?
    class Saler extends User{...}

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


    Вот то — поля родительской сущности в отдельной таблице, в своей только индивидуальные
    Class Table Inheritance

    UPD: Немного перепутал с типом наследования, не single table, а class table конечно. Возможно вы разобрались, но другим пометки
    Ответ написан
    1 комментарий
  • Ошибка EntityManager#remove() expects parameter 1 to be an entity object, array given. - как исправить?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Если вы предполагаете, что придет одна сущность, то получайте объект правильно:
    $repository->findOneBy() вместо вашего $repository->findBy()
    В противном случае у вас приходит массив с одним элементом
    Ответ написан
    1 комментарий
  • В чем смысл быть гуру тостера?

    Maksclub
    @Maksclub
    maksfedorov.ru
    много причин:
    1. Помощь другим, понятное дело

    2. Мне помогло в началае карьеры вот чем -- начал работать программистом и в ходе нее сталкивался с одного рода проблемами, тогда как тут люди сталкиваются с широким спектром проблем и задач и в начале пути мне этот вал давал развитие!
    Да, я открывал вопрос, не знаю ответ -- пошел курить мануалы, читать SO и гуглить, открывал IDE и продумывал что и как... потом писал ответ

    3. Некий способ запомнить (как блог работает), помогая другим запоминаешь сам, формулируя мысль... Грубо говоря не 1% инфы запоминаешь, а 3% :):):) примерно, но больше в разы точно

    4. Социальная причина, тут грубо говоря собраны "собратья" по отрасли, с моими друзьями не обсудить и не рассказать про абстракции, про паттерны

    5. Помогает в трудоустройстве, не во всех случаях, но в некоторых точно

    6. С особенностью слежу за новой технологией, которую изучаю, и смотрю на ответы крутых ребят. Тут есть человек так 20, которых стоит читать в отрыве от вопросов, так как к ответу подходят системно

    7. Записная книжка -- всегда есть куда обратиться к своим же ответам
    Ответ написан
    Комментировать
  • Как правильно запустить потребителя rabbitmq?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Ответ написан
    Комментировать
  • Как сделать больше двух редиректов в php?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Google Chrome allows a maximum of 20 redirects, as tested with this PHP script:
    Ответ написан
    Комментировать
  • Как получить данные из бд и записать их в файл js?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Нужно поднять простенький бекенд:
    1. нужно развернуть HTTP-сервер, чтобы можно было до нужного роута достучаться, можно например с помощью Express JS
    2. сделать хэндлер для обработки роута, в котором и будет идти сбор необходимых данных
      (например достать из MongoDB)

    В JS приложении уже нужно будет к этому роуту обратиться и он вернет нужные данные
    Например с помощью: https://github.com/CharlesMangwa/react-data-fetchi...
    Или с более лучшим для вас решением под Реакт

    Чтобы потом работать нормально, можно Express подружить с Nginx, чтобы он проксировал запросы: https://gist.github.com/tomasevich/a2fe588c451c5a1...
    Но я могу ошибиться, тк в этом стеке совсем не работаю
    Ответ написан
    Комментировать
  • Как ОС понимает, какую версию просит java?

    Maksclub
    @Maksclub
    maksfedorov.ru
    В Linux (также UNIX) $PATH — это переменная среды, используемая для указания оболочке, где искать исполняемые файлы. $PATH обеспечивает большую гибкость и безопасность для систем Linux, и, безусловно, можно сказать, что это одна из самых важных переменных среды.

    Программы/скрипты, расположенные в каталоге $PATH, могут быть выполнены непосредственно в вашей оболочке без указания полного пути к ним. В этой статье вы узнаете, как установить переменную $PATH глобально и локально.
    Ответ написан
    Комментировать
  • Как сделать самый простой деплой в GitLab?

    Maksclub
    @Maksclub
    maksfedorov.ru
    И как бы сделали вы.

    Поставил бы Deployer, на нем уже есть таски:
    - GIT
    - зависимости NPM/Composer
    - чистка кеша и вот это все
    - релизы (в случае ошибки -- не катить релиз и миграции откатить)
    - расстановка прав и прочие штучки, если нужно
    - если есть тесты -- прогон их, также phpstan и прчоее
    все таски по желанию

    В Gitlab CI вызывал бы в вашем случае примерно так:
    deploy-master:
        stage: deploy
            script: dep --file=deploy/deploy.php -vvv deploy prod

    Где:
    dep -- запуск деплоера
    prod -- название проекта из настроек самого деплоера (или окружение для нескольких проектов)

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

    Если нужно очень просто
    (а сейчас достаточно просто)
    То просто у деплоера написал бы минимум тасок -- выложить из мастера ГИТ и перелинковать релиз
    Ответ написан
    1 комментарий
  • Что делать с ошибкой при клонировании репозитория?

    Maksclub
    @Maksclub Куратор тега Веб-разработка
    maksfedorov.ru
    Это моя вина или в чем?

    Вина :) нет прав к репозиторию и все, без всякой вины.

    Проверьте:
    - в Github/Bitbucket/Gitlab вам должны быть права на чтение к репозиторию
    - ваши ssh-ключи должны быть добавлены для пользователя
    Ответ написан
    Комментировать
  • Что означает ::class?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    AnimalHydrator::class === '\YouNamespace\AnimalHydrator'

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

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

    Maksclub
    @Maksclub
    maksfedorov.ru
    Посмотрите основы, поймете, дальше разберетесь:

    PSR-7 фреймворк 2/7: Роутинг и контроллеры

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

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Ошибки?
    3** -- это коды ответа сервера (редиректы), это не ошибки
    https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D...

    4** и 5** -- уже ошибки (на клиенте и сервере соответственно)

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

    Maksclub
    @Maksclub Куратор тега Веб-разработка
    maksfedorov.ru
    Если проект на php, то прекрасно подойдёт Deployer (на php, парень из Aviasalrs написал) , использую его в разработке, где я один разработчик (и на работе в достаточно сложном CI тоже его используем)

    Таски пишут очень легко -- для подтягивания ветки Git, для подтягивания библиотек php и js, для миграций, делает релизы и более сложные вещи... Легко и дешево

    Если что -- пиши вопросы в лк
    Ответ написан
    Комментировать
  • Как написать код запроса в БД в связке с массивом?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Взять все нужные Id, по ним одним запросом взять данные из БД, всем полученным насытить то, что вам нужно
    Ответ написан
    2 комментария
  • Где найти простенький request класс на php?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    PSR-7 Request -- дефакто стандарт в отрасли https://www.php-fig.org/psr/psr-7/

    Вот простой http клиент:
    https://github.com/zendframework/zend-diactoros

    Пример использования:
    // Create a request
    $request = (new Zend\Diactoros\Request())
        ->withUri(new Zend\Diactoros\Uri('http://example.com'))
        ->withMethod('PATCH')
        ->withAddedHeader('Authorization', 'Bearer ' . $token)
        ->withAddedHeader('Content-Type', 'application/json');
    
    // OR:
    $request = new Zend\Diactoros\Request(
        'http://example.com',
        'PATCH',
        'php://memory',
        [
            'Authorization' => 'Bearer ' . $token,
            'Content-Type'  => 'application/json',
        ]
    );
    
    // If you want to set a non-origin-form request target, set the
    // request-target explicitly:
    $request = $request->withRequestTarget((string) $uri);       // absolute-form
    $request = $request->withRequestTarget($uri->getAuthority()); // authority-form
    $request = $request->withRequestTarget('*');                 // asterisk-form
    
    // Once you have the instance:
    $request->getBody()->write(json_encode($data));
    $response = $client->send($request);
    Ответ написан
    1 комментарий
  • Какой использовать паттерн проектирования для интеграции c внешним сервисом?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Не складывается все пока в единую структуру

    Глаза боятся, руки делают

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

    Допустим вы под таким сервисом понимаете сервис доставки -- такой сервис в будущем понадобится подменить, заменить и т.д... Там есть и работа с пользователями и с заказами.

    Простой набросок со Стратегией

    Можно придумать некий интерфейс клиента:
    // Принимает ваши учетные данные
    DeliveryClientInterface::__construct(?string $account = null, ?string $password = null)
    
    // Регистрируем покупателя в сервисе
    DeliveryClientInterface::registerCustomer(DeliveryCustomer $customer): int
    
    // Получаем заказы покупателя в сервисе
    DeliveryClientInterface::getOrders(int $customerId): DeliveryOrder
    
    // Добавляем заказ покупателю
    DeliveryClientInterface::addOrder(int $customerId, DeliveryOrder $order): int
    
    // Оповещение покупателя в сервисе о неком действии, связанной с ним в этом сервисе
    DeliveryClientInterface::notifyCustomer(DeliveryEvent $event): bool


    И научить свой проект работать с таким кодом, через интерфейсы
    // что в конструктор сервиса запихнете, например PochtaClient или PickPointClient,
    // с тем и будете работать
    class DeliveryService
    {
        public function __construct(DeliveryClientInterface $deliveryClient, User $user)
    }
    
    $userOrders = $this->deliveryService->getOrders($user->getUuid());


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

    Далее в клиентском коде подключайте нужный вам клиент через конфиг/контейнер и все будет работать.
    Ответ написан
    Комментировать