Ошибка промежуточного программного обеспечения Laravel: аргумент № 1 ($content) должен иметь тип ?string, задан Illuminate\Routing\Redirector

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

Symfony\Component\HttpFoundation\Response::setContent(): Argument #1 ($content) must be of type ?string, Illuminate\Routing\Redirector given

Ошибка вызвана return $next($request);, ниже мое промежуточное ПО:

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\Event;
class EventOwner
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        if (isset($request["id_event"])){
            $event_id = $request["id_event"];
            $events = Event::where('id', $event_id)->where('user_id', Auth::user()->id)->first();
            if (isset($events)){
                if ($events->id == $event_id){
                    return $next($request);
                }else{
                    $message = '401 - NOT AUTHORIZED';
                    return response(view('errors.not-auth', compact('message')), 401);
                }
            }else{
                $message = '401 - NOT AUTHORIZED';
                return response(view('errors.not-auth', compact('message')), 401);
            }
        }
    }
}

Я уже изменил свой возврат на return redirect()->route('register');, чтобы вернуть объект перенаправления, но ничего не произошло.

Я тоже пытался улучшить свой код, я изменил его на это:

 public function handle(Request $request, Closure $next)
    {
            $event_id = $request["id_event"];
            if (!$event_id) {
               abort(404);
            }
            $events = Event::where('id', $event_id)->where('user_id', Auth::user()->id)->first();
            if ($events->isEmpty()) {
              $message = '401 - NOT AUTHORIZED';
              return response()->view('errors.not-auth', compact('message'), 401); // Create response with error view
            }
            return $next($request);
    }

хотя это хорошее улучшение, я до сих пор не знаю, как воспроизвести ошибку или что ее вызвало.

Я попробовал php artisan config:clear на своем действующем сервере, но опять же не знаю, сработает ли это, потому что не могу воспроизвести ошибку.

Может ли кто-нибудь помочь мне решить эту проблему и найти причину ошибки? Заранее спасибо.

🤔 А знаете ли вы, что...
PHP обладает хорошей производительностью благодаря опкодированию.


1
148
2

Ответы:

Решено

Это не проблема, связанная с промежуточным программным обеспечением, это проблема на уровне маршрутизатора/контроллера. После завершения работы вашего промежуточного программного обеспечения вы выполняете несколько перенаправлений на своем маршрутизаторе/контроллере, и ваш return redirect();, вероятно, пуст. Проверьте свои перенаправления после промежуточного программного обеспечения.


По сути, произошло то, что у меня есть return redirect(session('links')); (пользовательский файл cookie, который я создал с URL-адресом с предыдущей страницы) более чем в одной функции и контроллере, поэтому, если срок действия файла cookie истек или если пользователь получил доступ к странице непосредственно по URL-адресу (при этом методе файл cookie не имеет предыдущей страницы), когда пользователь, например, нажимает кнопку «Сохранить», когда он обновляет событие*, в локальной среде появляется ошибка.

*Context: i have an event management project.

Чтобы решить мою проблему, я изменил свою функцию, я просто добавил if:

public function update(Request $request, $id)
    {
        $request->validate([
            'id' => 'required',
            'name' => 'required|max:30',
            'capacity' => 'required',
        ]);

        $input = $request->all();

        $event= Event::find($id);
        $event->update($input);

        if (session('links')){
            return redirect(session('links'));
        }

        return abort(419);
    }