Как избежать дублирования кода для обработки пула запросов в Laravel?

Ссылка скопирована
1 ответ

Приветствую! Есть задача, обновлять статус отправлений. Есть таблица в БД, которая хранит все данные о заказах. Хочу обновлять в ней колонку со статусами и потом уже на клиенте по разному отображать данные о заказе используя фильтр. Затык в моменте понимания, как отправлять принимать и обработать запросы?

Дублировать, код ниже, ради одной строчки смотрится мне не самым лучшим решением.
Использовал Фасад НТТР-клиента, отправлял через pool 3 запроса, с изменением тела запроса на нужный статус, но получал 404 ответ. В общем пока не совсем ясно как это сделать, так как ещё в процессе изучения Laravel
spoiler

public function getData()     {         //Запрос к API для получения данных о необработанных отправлениях          $response = Http::withHeaders([             'Client-Id' => 'ID',             'Api-Key' => 'key'         ])->post('https://api-seller.ozon.ru/v3/posting/fbs/unfulfilled/list', [             'dir' => 'ASC',             'filter' => [                 'cutoff_from' => date("Y-m-dTh:i:sZ", strtotime('today')),                 'cutoff_to' => date("Y-m-dTh:i:sZ", strtotime('tomorrow')),                 'status' => 'awaiting_deliver',                 'delivery_method_id' => [],                 'provider_id' => [],                 'warehouse_id' => [],             ],             'limit' => 100,             'offset' => 0,             'translit' => true,             'with' => [                 'analytics_data' => true,                 'financial_data' => true,             ]         ]);          dump($response->json()['result']['postings']);           //Преобразование ответа в массив и создание коллекции для добавления данных в БД          $decode = $response->json()['result']['postings'];         $collection = collect($decode);          $collection->map(fn($collection) => Order::firstOrCreate([             'order_date' => $collection['in_process_at'],             'shipment_date' => $collection['shipment_date'],             'vendor_code' => $collection['products'][0]['offer_id'],             'product_name' => $collection['products'][0]['name'],             'price' => $collection['products'][0]['price'],             'status' => $collection['status'],         ]));          //Получения данных из БД и вывод информации на страницу          $orders = Order::whereDate('order_date', now()->toDateString())->get();                  return view('orders', compact('orders'));     }

public function getData() { //Запрос к API для получения данных о необработанных отправлениях $response = Http::withHeaders([ 'Client-Id' => 'ID', 'Api-Key' => 'key' ])->post('https://api-seller.ozon.ru/v3/posting/fbs/unfulfilled/list', [ 'dir' => 'ASC', 'filter' => [ 'cutoff_from' => date("Y-m-dTh:i:sZ", strtotime('today')), 'cutoff_to' => date("Y-m-dTh:i:sZ", strtotime('tomorrow')), 'status' => 'awaiting_deliver', 'delivery_method_id' => [], 'provider_id' => [], 'warehouse_id' => [], ], 'limit' => 100, 'offset' => 0, 'translit' => true, 'with' => [ 'analytics_data' => true, 'financial_data' => true, ] ]); dump($response->json()['result']['postings']); //Преобразование ответа в массив и создание коллекции для добавления данных в БД $decode = $response->json()['result']['postings']; $collection = collect($decode); $collection->map(fn($collection) => Order::firstOrCreate([ 'order_date' => $collection['in_process_at'], 'shipment_date' => $collection['shipment_date'], 'vendor_code' => $collection['products'][0]['offer_id'], 'product_name' => $collection['products'][0]['name'], 'price' => $collection['products'][0]['price'], 'status' => $collection['status'], ])); //Получения данных из БД и вывод информации на страницу $orders = Order::whereDate('order_date', now()->toDateString())->get(); return view('orders', compact('orders')); }

Дополнительно:

Я не понял вопрос.

  • JhaoDa, обновил тему топика. Вопрос в организации кода. Мне, по сути, надо отправить 3 индеитичных запроса, который будут отличаться только одной парой ключ-значение в теле запроса. Как это лучше сделать?
  • Фёдор, о какой одной строчке ты говоришь? Где в представленном коде эта самая «одна строчка»?
  • 'filter' => [      'status' => 'awaiting_deliver', ]

    'filter' => [ 'status' => 'awaiting_deliver', ]

    Я хочу отправить ещё 2 запроса и получить другие статусы и список товаров, которые придут в ответе и которых ещё нет в БД

  • Вынести работу с озон апи в отдельный класс?
  • Фёдор,
    public function getData(array $filter = [])     {         //Запрос к API для получения данных о необработанных отправлениях          $response = Http::withHeaders([             'Client-Id' => 'ID',             'Api-Key' => 'key'         ])->post('https://api-seller.ozon.ru/v3/posting/fbs/unfulfilled/list', [             'dir' => 'ASC',             'filter' => array_merge([                 'cutoff_from' => date("Y-m-dTh:i:sZ", strtotime('today')),                 'cutoff_to' => date("Y-m-dTh:i:sZ", strtotime('tomorrow')),                 'status' => 'awaiting_deliver',                 'delivery_method_id' => [],                 'provider_id' => [],                 'warehouse_id' => [],             ], $filter),             'limit' => 100,             'offset' => 0,             'translit' => true,             'with' => [                 'analytics_data' => true,                 'financial_data' => true,             ]         ]);          dump($response->json()['result']['postings']);

    public function getData(array $filter = []) { //Запрос к API для получения данных о необработанных отправлениях $response = Http::withHeaders([ 'Client-Id' => 'ID', 'Api-Key' => 'key' ])->post('https://api-seller.ozon.ru/v3/posting/fbs/unfulfilled/list', [ 'dir' => 'ASC', 'filter' => array_merge([ 'cutoff_from' => date("Y-m-dTh:i:sZ", strtotime('today')), 'cutoff_to' => date("Y-m-dTh:i:sZ", strtotime('tomorrow')), 'status' => 'awaiting_deliver', 'delivery_method_id' => [], 'provider_id' => [], 'warehouse_id' => [], ], $filter), 'limit' => 100, 'offset' => 0, 'translit' => true, 'with' => [ 'analytics_data' => true, 'financial_data' => true, ] ]); dump($response->json()['result']['postings']);

    $service->getData(); // по умолчанию $service->getData(['status' => 'another_status']); // с другим статусом

    $service->getData(); // по умолчанию $service->getData(['status' => 'another_status']); // с другим статусом

  • Сергей delphinpro, Мне кажется автор ещё и хочет параллельно это выполнять...

    . . . Использовал Фасад НТТР-клиента, отправлял через pool 3 запроса . . .

  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Сергей Миронов Ответ

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

    Для создания middleware в Laravel нужно выполнить несколько шагов. Сначала создайте middleware с помощью команды artisan:

    php artisan make:middleware CheckPoolRequests

    php artisan make:middleware CheckPoolRequests

    После этого в файле `app/Http/Middleware/CheckPoolRequests.php` определите логику обработки запросов. Например, проверьте, что в запросе есть необходимые параметры для работы с пулом запросов:

    namespace App\Http\Middleware;
     
    use Closure;
     
    class CheckPoolRequests
    {
        public function handle($request, Closure $next)
        {
            if ($request->has('pool_id')) {
                // Обработка пула запросов
                return $next($request);
            }
     
            return response('Missing pool_id parameter', 400);
        }
    }

    namespace App\Http\Middleware; use Closure; class CheckPoolRequests { public function handle($request, Closure $next) { if ($request->has('pool_id')) { // Обработка пула запросов return $next($request); } return response('Missing pool_id parameter', 400); } }

    После определения middleware зарегистрируйте его в файле `app/Http/Kernel.php` в массиве `$routeMiddleware`:

    protected $routeMiddleware = [
        'checkPoolRequests' => \App\Http\Middleware\CheckPoolRequests::class,
    ];

    protected $routeMiddleware = [ 'checkPoolRequests' => \App\Http\Middleware\CheckPoolRequests::class, ];

    Теперь можно применить middleware к роутам или группам роутов. Например, применим middleware к группе роутов в файле `routes/web.php`:

    Route::group(['middleware' => 'checkPoolRequests'], function () {
        // Здесь находятся роуты, которые требуют проверки пула запросов
    });

    Route::group(['middleware' => 'checkPoolRequests'], function () { // Здесь находятся роуты, которые требуют проверки пула запросов });

    Таким образом, вы избежите дублирования кода для обработки пула запросов в Laravel, используя механизм middleware. Код обработки будет находиться в единственном месте и будет применяться ко всем необходимым роутам.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно