Ответы пользователя по тегу PHP
  • Как получить телефон из Google OAuth 2.0 API?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    JS - это моё хобби
    Сервис
    работает нормально, если есть лучший способ, буду признателен, если поделитесь.
    class GoogleService
    {
        public function getClient(): \Google_Client
        {
            $configJson = base_path().'/config/google-oauth.json';
            $applicationName = 'Some';
    
            $client = new \Google_Client();
            $client->setApplicationName($applicationName);
            $client->setAuthConfig($configJson);
            $client->setAccessType('offline');
            $client->setApprovalPrompt ('force');
    
            $redirectUri = env('GOOGLE_REDIRECT_URI');
            $client->setRedirectUri($redirectUri);
    
            $client->setScopes(
                [
                    \Google\Service\Oauth2::USERINFO_EMAIL,
                    \Google\Service\Oauth2::OPENID
                ]
            );
            $client->setIncludeGrantedScopes(true);
    
            return $client;
        }
    
        public function fetchUserData(string $code)
        {
            $data = [];
            $client = $this->getClient();
            $client->authenticate($code);
    
            $oauth2Service = new Oauth2($client);
            $userInfo = $oauth2Service->userinfo->get();
            $data['userInfo'] = $userInfo;
    
            $client->fetchAccessTokenWithAuthCode($code);
            $accessToken = $client->getAccessToken();
            $accessToken['grant_type'] = 'urn:ietf:params:oauth:grant-type:jwt-bearer';
    
            $guzzleClient = new GuzzleClient();
            $response = $guzzleClient->request('GET', "https://people.googleapis.com/v1/people/{$userInfo->id}?personFields=phoneNumbers,birthdays,genders", [
                'headers' => [
                    'Authorization' => 'Bearer ' . $accessToken['access_token'],
                ],
            ]);
    
            $data['personal'] = json_decode($response->getBody()->getContents(), true);
            
            return $data;
        }
    }

    Получаем телефон, день рождение, пол из настроек профиля пользователя в гугл с помошью php.
    Ответ написан
    Комментировать
  • Как получить в php данные отправленные через fetch?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    JS скрипт отправляет fetch запрос, а контроллер принимает его.

    Обычно сложности с ajax возникают, когда вы делаете запрос не на api, а к файлу. В таком случае вызываемый файл не должен быть index.php
    Ответ написан
  • Как работает PHP, Браузер - PHP?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    По-поводу процессов в PHP-FPM есть вводное видео.
    Рекомендую ознакомится.

    В вашем случае, и везде где нужно сохранять порядок, используется очередь
    Пример очереди

    Суть очереди в том, что вы используете базу данных, для сохранения каждого запроса, а воркер ищет добавленные в очередь (записи в бд) задачи и выполняет их по принципу FIFO.
    Ответ написан
    Комментировать
  • Можно ли считать большинство ошибок в PHP исключениями?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Относитесь к этому как к оператору return, который останавливает работу программы и возвращает ответ в фронтенд.

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

    Например, при ajax запросах, исключения очерчивают границы бизнес логики. Так, если сумма равна нулю, то выбросить исключение с текстом, что сумма должна быть больше нуля и т.д.

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

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Вы не передаёте аргумент в ExternalResponse2()
    $getExternalData2Value = new ExternalResponse2();
    И если, метод используется, только внутри класса, то нужно объявлять его как private.
    private function getExternalData2($request): ExternalResponse2 { ... }
    Ответ написан
  • Как лучше организовать архитектуру проекта?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Архитектура бывает двух типов:
    • На которой идёт быстрая разработка
    • Удобная для поддержки проекта

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

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

    Что касательно вашей ситуации, то вам следует опираться на принцип "Единственной ответственности", суть которого в том, что к каждого компонента может быть только одна причина для изменения.

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

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

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

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    $arr1 = [4,5,6];
    $arr2 = [1,2,3,4,5,6];
       
    $unique = array_unique([...$arr1, ...$arr2]);
    Ответ написан
    Комментировать
  • Что не так в коде (можете сделать краткое код ревью)?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    . Всё работает, все просто, что ещё от джуна надо?

    Чтобы он старался и стремился соответствовать тому, что ему говорят опытные разработчики.
    Ответ написан
    Комментировать
  • Как отнять из числа значение массива?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Приводи к типу int.
    $arr = [6094, 6095, 6096];
    $result = 288641 - (int)$arr[0];
    print_r($result);                     // 282547
    Ответ написан
    Комментировать
  • Можно ли вывести адрес переменной в php?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Похожий вопрос
    Адреса памяти бесполезны в PHP-скриптах, поскольку интерпретатор обрабатывает всю внутреннюю переменную.
    Ответ написан
    Комментировать
  • Как удалить данные из массива?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Ответ написан
    Комментировать
  • Выучил синтаксис языка. как использовать его на практике?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    1) Изучить что такое MVC. По курсам на youtube.
    2) Написать собственный MVC шаблон. Самостоятельно, после курсов, повторяя принципы ООП.

    Для начала можно переписать чей-нибудь курс по созданию сайта на MVC на youtube. Вникните в каждую строчку этого курса, и научитесь ориентироваться в ООП, и соответственно чужом коде.
    Ответ написан
    2 комментария
  • Обновление php на centos7?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Могу посоветовать вам использовать Docker.
    Установка:
    sudo dnf install docker docker-compose -y
    sudo systemctl start docker
    sudo systemctl enable docker

    Добавить пользователя в группу docker и предоставить права файлу на исполнение
    sudo usermod -aG docker userName                 // userName - пользователь под которым вы в системе
    sudo chmod +x /usr/bin/docker-compose
    sudo service docker restart

    Скачиваете репозиторий с готовой сборкой PHP 8:0
    Из папки куда сохранили запускаете сборку контейнеров командой в консоли:docker-compose up -d

    В _docker/php/Dockerfile указана версия образа php:8.0-fpm, но вы можете указать любую, доступную в официальном репозитории Docker, выбрав нужный тэг.

    В браузере сайт доступен по адресу localhost:81
    А phpMyAdmin по адресу localhost:8080 с паролем root

    Не забудьте удалить mariaDb и apache из systemctl, так как сервер и БД будут работать не из systemctl , а из docker контейнера.
    Ответ написан
  • Как по очереди проверять и по очереди убирать лишнее?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Вам пригодятся регулярные выражения
    Сервис для проверки регулярных выражений

    Потом его разделяю на массив где MAX_SMART_FILTER_687_4089903629 то что мне нужно и уже этот ID я сравниваю с тем что выдается в карточке товара

    В таком случае достаточно проводить проверку с помощью регулярных выражений:
    $regExp = '#' . $id['affiliation'] . '#';
    foreach($arr as $key => $string) if(preg_match($regExp, $string)) unset($arr[$key]);

    В $regExp размещаете своё условие для поиска.
    $arr это ваш массив со строками.

    Делаете перебор массива со строками.
    При нахождении нужного id, удаляете из массива со строками данный элемент.

    Если нужна помощь в составлении регулярного выражения, обращайтесь.
    Ответ написан
  • Есть ли разница между памятью в PHP и C#?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Адреса памяти бесполезны в PHP-скриптах, поскольку интерпретатор обрабатывает всю внутреннюю переменную.

    Работа с памятью: "Разделяемая память" но об этом джуна точно не спросят.

    Работа с очередью
    Работа со структурами данных итераторов

    Для повышения уровня понимания, как эта самая внутренняя переменная создаётся: JIT в PHP 8

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