【问题标题】:Laravel Parameter in every url每个网址中的 Laravel 参数
【发布时间】:2019-06-04 02:52:33
【问题描述】:

我已经阅读了网络和文档中的几乎所有内容,但我找不到我的问题的解决方案。

我有一个变量存储在 Session 中,然后我想把这个变量放在 route('some-route') 生成的每个 url 中。

Session 我有sub = "mysubid"

当我生成路由route('my-route') 时,我想在查询字符串中传递这个sub 参数:http://domain.dom/my-route-parameter?sub=mysubid

你能帮我解决这个问题吗?任何有用的答案将不胜感激;

【问题讨论】:

  • 我知道我不能传递像这样的参数:route('my-route', ['sub' => \Session::get('sub') ]) 但我的观点中有太多的路线来重构它,我想让它自动
  • 你为什么要这样做?您已经将该数据存储在会话中。
  • 明确一点:您希望所有路由都具有相同的参数总是
  • 是的,这是有原因的,也是经理的好主意:D
  • @MalkhaziDartsmelidze 请注意,我稍微更新了您的标签以显示 Laravel 5.7。

标签: php laravel laravel-routing laravel-5.7 php-7.2


【解决方案1】:

您可以使用默认值功能。

首先新建一个中间件php artisan make:middleware SetSubIdFromSession。然后执行以下操作:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class SetSubIdFromSession
{
    public function handle($request, Closure $next)
    {
        URL::defaults(['sub' => \Session::get('sub')]);

        return $next($request);
    } 
}

最后在app/Http/Kernel.php 中注册您的新中间件,方法是将其添加到$routeMiddleware

protected $routeMiddleware = [
   // other Middlewares
   'sessionDefaultValue' => App\Http\Middleware\SetSubIdFromSession::class,
];

{sub} 和中间件添加到您的路由定义中:

Route::get('/{sub}/path', function () {  
   //
})
->name('my-route')
->middleware('sessionDefaultValue');

由于您希望在每条网络路由上都使用这个,您还可以将中间件添加到 web 中间件组:

protected $middlewareGroups = [
    'web' => [
        // other Middlewares
        'sessionDefaultValue',
    ],

    'api' => [
        //
    ] 
];

【讨论】:

  • 好主意,但我无法使用此代码通过查询字符串传递参数
  • 我没有收到错误,但它没有在 url 上附加查询
  • 你使用哪个版本的 Laravel?
  • 我使用的是 5.7 版本
【解决方案2】:

试试这个,你需要创建中间件 php artisan make:middleware SetSubSession

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class SetSubsSession
{
public function handle($request, Closure $next)
{
    if(session('sub')){
        $url = url()->full();
        return redirect($url.'?sub='.session('sub'));
    }
    return $next($request);
} 
} 

在 app/http/Kernel.php 中

 protected $routeMiddleware = [
 ........
 'setsubsession' => \App\Http\Middleware\SetSubsSession::class,
 ]

在route.php中添加

 Route::group(['middleware' => 'setsubsession'], function(){ 
      //and define all the route you want to add sub parameter
 });

使用它您不需要更改所有路由。这将自动在该中间件定义的路由中添加“sub”。

【讨论】:

  • 请考虑这种方法的性能后果。首先,这可能会导致无限循环,它不会检查请求中是否已经设置了sub,因此它会再次尝试重定向。然后,如果你解决了这个问题,每个链接仍然会以 2 个请求结束:没有sub 的初始请求,然后是重定向请求。
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多