Как избежать дублирования кода для обработки пула запросов в Laravel?
Приветствую! Есть задача, обновлять статус отправлений. Есть таблица в БД, которая хранит все данные о заказах. Хочу обновлять в ней колонку со статусами и потом уже на клиенте по разному отображать данные о заказе используя фильтр. Затык в моменте понимания, как отправлять принимать и обработать запросы?
Дублировать, код ниже, ради одной строчки смотрится мне не самым лучшим решением.
Использовал Фасад НТТР-клиента, отправлял через 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')); }
Дополнительно:
Я не понял вопрос.
'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']); // с другим статусом
. . . Использовал Фасад НТТР-клиента, отправлял через pool 3 запроса . . .
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для избежания дублирования кода при обработке пула запросов в Laravel можно использовать механизм middleware. Middleware в Laravel позволяет обрабатывать запросы перед тем, как они попадут в контроллер. Это позволяет выполнить какие-то действия до обработки запроса и после него, не дублируя код в каждом контроллере.
Для создания middleware в Laravel нужно выполнить несколько шагов. Сначала создайте middleware с помощью команды artisan:
php artisan make:middleware CheckPoolRequestsphp 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); } }
После определения middleware зарегистрируйте его в файле `app/Http/Kernel.php` в массиве `$routeMiddleware`:
protected $routeMiddleware = [ 'checkPoolRequests' => \App\Http\Middleware\CheckPoolRequests::class, ];
Теперь можно применить middleware к роутам или группам роутов. Например, применим middleware к группе роутов в файле `routes/web.php`:
Route::group(['middleware' => 'checkPoolRequests'], function () { // Здесь находятся роуты, которые требуют проверки пула запросов });
Таким образом, вы избежите дублирования кода для обработки пула запросов в Laravel, используя механизм middleware. Код обработки будет находиться в единственном месте и будет применяться ко всем необходимым роутам.