आप वर्तमान मार्ग के लिए बिचौलियों को कैसे पुनः प्राप्त करते हैं?

यदि आप वेबसाइट के किसी विशेष भाग के भीतर हैं, तो यह जांच कर कि मार्ग में कोई मिडलवेयर जोड़ा गया है या नहीं, इस आधार पर मैं अपवाद हैंडलर को अलग तरीके से काम करने के लिए सेट करने का प्रयास कर रहा हूं।

<?php

namespace App\Exceptions;

//use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Abrigham\LaravelEmailExceptions\Exceptions\EmailHandler as ExceptionHandler;

use Illuminate\Routing\Exceptions\InvalidSignatureException;
use Illuminate\Support\Facades\Route;
use Throwable;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Throwable  $exception
     * @return void
     *
     * @throws \Exception
     */
    public function report(Throwable $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Throwable  $exception
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \Throwable
     */
    public function render($request, Throwable $exception)
    {
        switch(true) {
            case $exception instanceof \Illuminate\Session\TokenMismatchException:
                // Redirect back if form invalid
                return redirect()
                    ->back()
                    ->withInput($request->except($this->dontFlash))
                    ->withErrors('The form has expired due to inactivity. Please try again');

                break;
            case $exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException:
                // Redirect back with message if model not found error
                $redirect = app('redirect');

                // Check for different url to prevent redirect loop
                if (request()->fullUrl() === $redirect->back()->getTargetUrl()){
                    
                    // $currentRouteMiddleware = request()->route()->controllerMiddleware() returns empty array
                    // $currentRouteMiddleware = Route::current()->router->getMiddleware(); router is private

                    $response = $redirect->to(isset($currentRouteMiddleware['admin.user']) ? '/admin' : '/');
                } else {
                    $response = $redirect->back();
                }

                return $response
                    ->withInput($request->except($this->dontFlash))
                    ->withErrors('That page could not be found. Please try again or report the broken link: ' . $request->getRequestUri());

                break;
        }

        return parent::render($request, $exception);
    }
}

यदि मैं राउटर के अंदर वर्तमान मार्ग को डंप करता हूं तो यह मिडलवेयर सरणी दिखाता है जिसकी मुझे जांच करने की आवश्यकता है: dd(Route::current()) लेकिन वर्तमान राउटर तक पहुंचने का कोई तरीका नहीं दिखता है जैसे: $currentRouteMiddleware = Route::current()->router->getMiddleware();

route dump

0
John Magnolia 3 जिंदा 2021, 22:38

2 जवाब

सबसे बढ़िया उत्तर

आप जो खोज रहे हैं उसके आधार पर कुछ विकल्प हैं।

यदि आप चाहते हैं कि सभी मिडलवेयर उपनाम मार्ग को सौंपे जाएं, तो आप इसका उपयोग कर सकते हैं:

Route::current()->gatherMiddleware();

यह असाइन किए गए मिडलवेयर समूहों का विस्तार नहीं करता है, इसलिए इसका परिणाम कुछ इस तरह दिख सकता है:

[
    'web',
    'admin.user'
]

यदि आप चाहते हैं कि सभी मिडलवेयर वर्ग मार्ग को सौंपे जाएं, तो आप इसका उपयोग कर सकते हैं:

Route::gatherRouteMiddleware(Route::current());

यह आपको कक्षाएं देगा, लेकिन इसमें कक्षाओं के लिए संबद्ध उपनाम या समूह नहीं होंगे। इससे परिणाम ऐसा दिख सकता है:

[
    "App\Http\Middleware\EncryptCookies",
    "Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse",
    "Illuminate\Session\Middleware\StartSession",
    "Illuminate\View\Middleware\ShareErrorsFromSession",
    "App\Http\Middleware\VerifyCsrfToken",
    "Illuminate\Routing\Middleware\SubstituteBindings",
    "TCG\Voyager\Http\Middleware\VoyagerAdminMiddleware"
]
1
patricus 7 जिंदा 2021, 14:01
request()->route()->controllerMiddleware();
0
zrkb 3 जिंदा 2021, 19:43