Что является противоположностью промежуточного программного обеспечения в Laravel? - PullRequest
0 голосов
/ 25 октября 2019

Промежуточное программное обеспечение в Laravel можно использовать для добавления логики всего приложения (или специфичной для определенных маршрутов или группы маршрутов). до применения любой прикладной / бизнес-логики. Я хочу сделать то же самое, но после вся логика приложения / бизнес завершена. Что мне нравится в промежуточном программном обеспечении, так это то, что оно централизует место, где применяется указанная логика. Есть ли способ сделать это в конце жизненного цикла запроса / ответа?

Один из вариантов - использование преобразователей , но я почему-то не считаю его таким же чистым, как промежуточное ПО (возможно, потому что это сделано третьей стороной?)

пример использования: я хочу, чтобы группа конечных точек всегда возвращала значения в альтернативной валюте, а не в долларах США, только когда такие запросы сделаны от определенного типа покупателейиз определенного географического района (который я уже знаю). Поэтому мне нужно будет выполнить бизнес-логику, а затем, прямо перед отправкой ответа json, я хочу «перехватить» указанный ответ и заменить все значения в долларах США другой валютой, которую я выберу.

Идеи? (Я использую Laravel 5.5)

1 Ответ

5 голосов
/ 25 октября 2019

Вы можете сделать это в .... промежуточном программном обеспечении сразу после вызова закрытия

/**
 * @param Request $request
 * @param \Closure $next
 * @return Response
 */
public function handle(Request $request, \Closure $next)
{
    //middleware logic
    $response = $next($request); //dont return it
    //post application/business logic here
    return $response;
}

Редактировать из комментария @ceejayoz:

Вы можетеиспользуйте метод terminate() в своем классе промежуточного программного обеспечения для запуска кода После того, что ответ был отправлен клиенту с условием, что ваш веб-сервер использует FastCGI.

public function handle(Request $request, \Closure $next)
{
    //middleware logic
    return $next($request); //dont return it
}

public function terminate($request, $response)
{
    //post application/business logic here
    //no need for return instruction
}

Edit 2 Для преобразования вывода json лучшим решением будет использование ResourceCollection.

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\ResourceCollection;

class Product extends ResourceCollection
{
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        $multiplier = $isUs?1.2:1;
        return [
            'price' = $this->price * $multiplier,
        ];
    }
}

. В вашем контроллере используйте этот класс в качестве ответа для контроллера

public function show($productId)
{
    return new \App\Http\Resources\Product(Product::find($productId));
}
...