2015-12-27 46 views
0

这让我疯狂,因为我认为我做的是正确的事情,但是它不能正常工作。中间件无法按预期方式工作 - Laravel

我有一个route与连接到它像下方的middleware;

Route::get('post/{id}/{name}', '[email protected]')->name('blog-post')->middleware('blogGuard'); 

正如你可以看到,我定义2个PARAMS 在我的控制器我有以下;

public function post() { 
    return view('pages.blog.post'); 
} 

这样定义的中间件;

public function handle($request, Closure $next) 
{ 

    if (is_null($request->input('id')) || 
     is_null($request->input('name'))) { 

     return redirect()->route('blog-home'); 
    } 

    return $next($request); 
} 

现在,如果我点击这样的链接; http://blog.example.co.uk/post/153/firstpostmiddleware不应该正确启动?

事实并非如此。 middleware执行并且我被重定向。但是,如果我删除middleware,那么我可以访问该页面。

任何帮助表示赞赏。

回答

1

如果您试图访问你可能想从路线明确地让他们路线参数。

$request->route('id'); // pulls the $route->parameter('id'); 
$request->route('name'); // pulls the $route->parameter('name'); 

$request->id会在返回路由参数之前检查请求输入。 $request->input('id')将仅检查请求的输入源而不检查路由参数。

如果您使用$request->id期望获得路由参数'id',则可以通过将id=anythinghere传递给查询字符串或将'id'var添加到发布请求来破坏您的逻辑。

+0

使用这个工程,但我没有被重定向到'bloh-home'而是我的'404'页面...我试过'(!$ id ||!$ name)'还有'($ id =“” || $ name =“”)'---如果我做了类似'http:// blog.example.co.uk/post/133'的事情,那意味着这个名字丢失了,重定向应该在 –

+0

想要使这些可选的路由参数。当他们被要求时,所有参数必须在那里以匹配路线。 – lagbox

+0

所以我想我真的不需要'中间件',因为如果有缺失的话,laravel会发送到404? –

0

试试这个

if (!$request->id || 
     !$request->name) 
+0

同样的事情,没有工作 –

+0

这工作,但现在,如果我这样做'HTTP重定向我不工作:// blog.example.co.uk /后/ 133' - 这里的名称丢失---它不应该重定向到'home',但重定向到404页 –

+0

我不建议在Request上使用神奇的getter来获取路由参数。它首先检查输入源,然后返回一个路由参数。 – lagbox

相关问题