【问题标题】:How to use middleware and controller on one route如何在一条路由上使用中间件和控制器
【发布时间】:2019-12-21 15:04:28
【问题描述】:

我必须在我的请求中添加 CORS 政策。 所以我创建了中间件

我已经尝试了以下方法:

Route::get('/test', ['middleware' => 'cors', 'cvGenerator@show'])

Route::get('/test', 'cvGenerator@show');
//inside controller 
$this->middleware('cors');

但以上都不起作用。 CORS 政策仍然中止

我的中间件代码:

namespace App\Http\Middleware;

use Closure;

class Cors
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    return $next($request)
  ->header('Access-Control-Allow-Origin' , '*')
  ->header('Access-Control-Allow-Methods' , 'GET, POST, PUT, DELETE, OPTIONS')
  ->header('Access-Control-Allow-Headers' , 'X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding');
}
}

和控制器:

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use PDF;
use Illuminate\Support\Facades\Storage;
class cvGenerator extends Controller
{
public function show(Request $request)
{
$this->middleware('cors');
    echo 'test';
    //some code that generate output
   }
}

我怎样才能通过请求?

【问题讨论】:

    标签: laravel controller cors middleware


    【解决方案1】:

    如果您只有一个应该通过中间件的路由。中间件也不属于控制器。

    Route::get('/test', 'cvGenerator@show')->middleware('cors');
    

    如果你有多个路由,你可以使用一个路由组。

    Route::group(['middleware' => ['cors']], function () {
        Route::get('/test', 'cvGenerator@show');
    });
    

    Laravel 也有关于 middleware 的非常好的文档。


    CORS

    我们正在使用这个中间件来支持飞行前CORS 请求:

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    
    class AddCorsHeaders
    {
        /**
         * Check for CORS request.
         *
         * @param \Illuminate\Http\Request $request
         * @param \Closure                 $next
         *
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $headers = [
                'Access-Control-Allow-Origin'      => $request->header('Origin'),
                'Access-Control-Allow-Methods'     => 'HEAD, POST, GET, OPTIONS, PUT, DELETE',
                'Access-Control-Allow-Headers'     => $request->header('Access-Control-Request-Headers'),
            ];
    
            if ($request->isMethod('OPTIONS')) {
                return response()->json('{"method":"OPTIONS"}', 200, $headers);
            }
    
            if ($request->header('Origin')) {
                config(['access-control-origin' => $request->header('Origin')]);
            }
    
            return $next($request);
        }
    }
    

    不要忘记将其添加到 kernel.php$routeMiddleware 数组中。

    'cors' => \App\Http\Middleware\AddCorsHeaders::class,
    

    【讨论】:

    • Route::get('/test')->middleware('cors');控制器请求应该在哪里?
    • 问题是,控制器的主要工作是生成 pdf 文件并将其保存在存储桶中。但没有 corse 他什么都不会做 xD
    • 糟糕,我更新了代码块。就在路线名称之后。示例:Route::get('/test', 'cvGenerator@show')
    • 我做到了 xD 问题是因为我忘记在 kornel 中间件 xD 中添加中间件,但我还有其他问题......你能帮我多一点吗?
    • 我愿意提供帮助,但如果不是关于中间件的问题,您最好为该问题创建一个新问题。
    猜你喜欢
    • 2018-03-09
    • 2016-04-21
    • 2022-07-05
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2012-01-08
    • 2021-05-31
    相关资源
    最近更新 更多