• Как получить телефон из 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 { ... }
    Ответ написан
  • Верное у меня представление о разработке fullstack web приложений?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Зависит от компании. бычно фронт занимается своими делами, а бэк своими.

    В лучшем случае, вы будете делать то, что говорит Тим-лид. Если нужно делать фронт на готовое от Бэка api, то значит в команде все хорошо. В редких случаях, фронту приходится мокать данные с Бэка, и работать со статичными данными.

    В худшем случае, это поддержка какого-нибудь сайта, где rest api и не пахнет.

    Если вы фронтэндер, то познакомьтесь с Postman. Например в виде гугл плагина. Научитесь работать с ответами роутов сайта. Вы можете создать свой проект, только фронт часть, а через Postman брать ответы с любого сайта, например api городов и стран, и встроить этот api в свой проект. Вам тогда вообще бэк знать не нужно будет.

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

    Бэк часть:
    • Не рабочая концепция проекта.
    • Не профессиональная архитектура. Обычно используется архитектура вида валидатор-контроллер-сервис-репозиторий. В данном случае это был бы ProductsService (директория products + класс в ней ProductsService). Также в этом сервисе лежал бы класс репозитория этого сервиса, где хранились бы методы запросов к базе данных. Запрос бы попадал в валидатор, затем в контроллер, оттуда в сервис, а сервис бы вызывал соответствующий метод в репозитории.
    • База данных. Нет внешнего ключа у продукта к категориям.
    • Нет типизации. Это нужно для статичных анализаторов, проверяющих код на ошибки. Пример public string $name - как свойство класса. public function getById(int $id) - как метод класса
    • Нет валидации запроса. Например, что поля формы должны не содержать определённые символы, или быть конкретного типа. (Очистка от тэгов , используемая в модели, должна находится ещё до того как запрос попадёт в контроллер.)
    • Коды и текстовки раскиданы по разным файлам. Всё должно лежать в одном файле, классе, куда будут обращаться все классы за результатом.
    • Отсутствует MVC. В каждом файле создаётся новый класс, и дескриптор подключения, хотя это повторяющееся действие нужно вынести в отдельный класс.
    • Коды ответа. Не соответствуют действительности. При создании не нужно возвращать 200. 200 подразумевает, что в ответе есть дополнительные данные. Правильный вариант 201


    Фронт часть:
    • JQuery это рудимент.
    • Bootstrap не используется, если есть нормальный отдел разработки.
    • Стили страницы не разбиты на верхнюю и нижнюю части.
    • Не используется отложенная загрузка скриптов.
    • Вместо файлов JS для каждого типа CRUD достаточно одного JS файла
    • HTML код в JS. Загрузка JS это одна из самых затратных операций. Чем больше размер файла, тем выше время загрузки. Что сильно отщутимо на мобилке.
    • Везде используется POST запрос. В restfull api POST для создания, GET - для получения, DELETE - для удаления, Patch - для обновления части модели, PUT - Для обновления всех полей модели.

    Этого курса достаточно, чтобы сделать востребованный на рынке restfull api проект.
    Ответ написан
    6 комментариев
  • Как можно оптимизировать запрос?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    ->with(['user:name', 'restaurant:address'])

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

    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 - это моё хобби
    mb_convert_encoding($city->name, "WINDOWS-1252");
    Ответ написан
    Комментировать
  • Как нужно внедрять mock, чтобы манипулировать возвращаемым от него результатом в методах теста Laravel?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    JS - это моё хобби
    Вариант со статичной переменной
    class OperationsServiceTest extends TestCase
    {
        public static $status = [true];
    
        public function setUp(): void
        {
            parent::setUp();
    
            $this->instance(
                PaymentService::class,
                Mockery::mock(PaymentService::class, function (MockInterface $mock) {
                    $mock->shouldReceive('getData')->andReturn(self::$status);
                })
            );
        }
    
        public function testPositive(): void
        {
            self::$status = [];
        }
    
        public function testNegative(): void
        {
             //  В негативном тесте mock уже вернёт пустой массив
        }
    }

    Так как setUp() вызывается перед запуском каждого метода, то с помощью статичной переменной, можно манипулировать возвращаемым результатом.
    Ответ написан
    Комментировать
  • Как отнять из числа значение массива?

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

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    В данном случае, можно провести проверку с предварительными вычислениями и вернуть результат в блок if:
    let scrolled = 500.98797,
        pageHeight = 500;
    
    if(comparison()) console.log("Размеры равны с учётом погрешности");
    else console.log("Размеры не равны");
    
    function comparison() {
    
        let check = [
            parseInt(scrolled),
            parseInt(scrolled) - 1,
        ];
    
        return check.includes(pageHeight) ? true : false;
    }
    Ответ написан
    Комментировать
  • Как реализовать autocomplete?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    Данный сервис предоставляет json объект с данными о пользователе

    Асинхронное получение geoip:
    async function getData() {
    
        new Promise((resolve) => {
    
            let info = loadData("https://json.geoiplookup.io/", 5000);
            if(info) resolve(info);
    
        }).then((data) => { 
            sent(data);
        }).catch((error) => {
            errorHandler(error.name);
        });
    }
    
    async function loadData(url, time) {
    
        let controller = new AbortController();
      
        let timeoutId = setTimeout(() => {
            controller.abort();
        }, time);
    
        let response = await fetch(url, {
            signal: controller.signal,
        });
    
        if(response) {
    
            clearTimeout(timeoutId);
            return await response.json();
        }
    }

    И соответственно в методе sent вставляете полученный город в поле формы или реализуете выпадающую подсказку для формы.
    function sent(data) {
        let city = getCity(data.city);      // Запрос для обратной транслитерации
        field.value = city;
    }
    Ответ написан
    Комментировать
  • Прокрутка slick slider после нажатия ссылки с data атрибутом?

    AgentSmith72
    @AgentSmith72
    JS - это моё хобби
    1) Вам нужно посчитать длину горизонтального скролла.
    scrollMyTabs()                       // Запускайте сразу после slickGoTo в вашем jQuery.
    
    function scrollMyTabs(slideIndex) {
        let difference = calculateDifference();
        let yourTabs;                         // Уникальное имя контейнера с вкладками
        yourTabs.scrollLeft += difference;
    }
    
    function calculateDifference() {
        // Возвращайте динамически подсчитанную разницу, на сколько сдвинуть вправо, исходя из того, какая длина вкладок, до вкладки с нужным slideIndex. 
       // Для каждого разрешения значение будет отличаться.
    }
    Ответ написан
    Комментировать
  • Можно ли вывести адрес переменной в php?

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

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

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

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