Ошибка при добавлении макроса для помощника ответа, связанного с методом json в Laravel 5

Я работаю над приложением Laravel 5, которое использует только маршруты API. Я создал макрос, чтобы расширить метод добавления cookie помощника ответа. Но я столкнулся с ошибкой, что мой макрос не существует.

Мы используем это для возврата ответа:

return response()->json($data, $status)
  ->cookie(
     'COOKIE_NAME',
     $value,
     $expiration,
     '/',
     app()->environment('production') ? config('app.domain') : null,
     app()->environment('production'),
     true
  );

поскольку данные после истечения срока действия всегда одинаковы для всех конечных точек с файлом cookie, я хочу создать макрос, который автоматически добавит эти данные в файл cookie и сократит код до этого:

return response()->json($data, $status)
  ->httpCookie('COOKIE_NAME, $value, $expiration);

Я создал ResponseServiceProvider и добавил макрос, используя метод Response::macro.

Вот мой код макроса:

public function boot()
{
  Response::macro('httpCookie', function ($name, $value, $expiration) {
    $isProd = app()->environment('production');
    return response()->cookie(
      $name, 
      $value,
      $expiration,
      '/',
      $isProd ? config('app.domain') : null,
      $isProd,
      true
    );
  });
}

Затем, пытаясь проверить конечную точку, я столкнулся с ошибкой:

BadMethodCallException
Method Illuminate\Http\JsonResponse::httpCookie does not exist.

Как я могу решить эту проблему? Спасибо.


person Letum Falx    schedule 12.07.2019    source источник
comment
Каково полное пространство имен вашего класса Response от поставщика услуг? (Это может быть Illuminate\Support\Facades\Response или Illuminate\Http\Response)   -  person Shizzen83    schedule 12.07.2019
comment
@Shizzen83 я использую Illuminate\Support\Facades\Response   -  person Letum Falx    schedule 13.07.2019


Ответы (1)


Когда я смотрю на Illuminate\Support\Facades \Response, фасад ответа проксирует Illuminate\Routing\ResponseFactory. Хотя ResponseFactory также поддерживает макросы, она используется для другой цели.

Поэтому, пожалуйста, добавьте макрос в правильный класс, в этом случае я думаю Illuminate\Http\Response:

use Illuminate\Http\Response;

public function boot()
{
  Response::macro('httpCookie', function ($name, $value, $expiration) {
    $isProd = app()->environment('production');
    return $this->cookie(
      $name, 
      $value,
      $expiration,
      '/',
      $isProd ? config('app.domain') : null,
      $isProd,
      true
    );
  });
}

person Kevin Bui    schedule 12.07.2019
comment
Вы должны объяснить, почему он работает с базовым классом, а не с самим фасадом. - person Shizzen83; 12.07.2019
comment
Это работает для меня. Но можете ли вы объяснить, почему это работает на Illuminate\Http\Response, а не на Illuminate\Support\Facades\Response, как сказал Shizzen83? - person Letum Falx; 13.07.2019
comment
Я добавил дополнительные пояснения. - person Kevin Bui; 15.07.2019