【问题标题】:Laravel get intended urlLaravel 获取预期的网址
【发布时间】:2014-02-25 06:59:32
【问题描述】:

我使用一个常见的httpRequest 登录,所以我可以使用Redirect::intended(); 在用户被引导到登录页面之前将其引导到一个url。一切都很好。

现在我已将登录更改为 ajax 请求,我现在只能在 javascript 中重定向 url。所以我必须将预期的网址传递给前端,然后执行window.location=url

问题是我无法获取intended/original 网址。任何善良的 laravel 专家可以帮助我吗?

【问题讨论】:

    标签: javascript php laravel


    【解决方案1】:

    在您的控制器操作中使用:

    $url = Redirect::intended( ... )->getTargetUrl();

    (其中... 是后备网址)

    然后在 JSON 响应中返回,并使用window.location 或其他方式进行重定向。

    【讨论】:

    • 在 Laravel 5.1 上为我工作。请务必包含use Illuminate\Support\Facades\Redirect;
    • laravel 5.4 使用 global redirect helper $url = redirect()->intended( ... )->getTargetUrl();
    【解决方案2】:

    当您显示表单敌人登录时,您可以从session 获取预期的url(如果可用)并将其传递给视图,然后使用window.location 重定向。

    所以。如何抢到intended url

    $intended_url = Session::get('url.intended', url('/'));
    Session::forget('url.intended');
    

    这里,第一个参数是intended url(如果在session 中可用),默认设置为使用url('/') 辅助方法的主页,因此$intended_url 将始终包含url,既定的或默认的。然后当你加载视图时,使用这个传递$intended_url

    return View::make('login')->with('intended_url', $intended_url);
    

    然后从视图中使用它:

    window.location = $intended_url;
    

    或者,您可以设置View Composer,这样每当显示login 视图/表单时,intended url 将在该视图中可用,您可以使用以下方法进行操作:

    View::composer('login', function($view){
        $intended_url = Session::get('url.intended', url('/'));
        Session::forget('url.intended');
        return $view->with('intended_url', $intended_url);
    });
    

    这里,login 是登录页面的视图名称,如果这是您的情况,请将其更改为您的 login 视图的适当名称。您可以将此代码保存在“global.php”文件内的app/start 文件夹中,或者将其保存在单独的文件中,并使用此(在末尾)将此文件包含在global.php 文件中:

    require 'view_composer.php';
    

    假设文件名为view_composer.php,位于app/start 文件夹中。

    【讨论】:

    • soory ,我无法在会话中使用 $intended_url ......无论我是否登录。它始终是默认值.. 有什么想法吗?
    • 根据Sessioin::get('url.intended', url('/')),如果会话中有可用的intended url,它应该返回,但如果没有,则返回默认的url。登录后,intended url 从会话中清除。
    【解决方案3】:

    在 Laravel 5.7 中:

    $url = redirect()->intended()->getTargetUrl();
    

    【讨论】:

    • 你可以传递一个链接到文档在哪里?,我找不到它。
    【解决方案4】:

    我在 Laravel 5.7 的自定义登录控制器和中间件中使用以下方法,但我希望它适用于任何 laravel 5 版本

    • 中间件内部

      if (Auth::check()){
          return $next($request);
      }
      else{
        return redirect()->guest(route('login'));
      }
      
    • 如果您没有将意图的 url 传递给客户端,请使用以下内部控制器登录方法

      if (Auth::attempt(['email' => $email, 'password' => $password])) {
      return redirect()->intended('/default');
      }
      
    • 如果你需要将意图的url传递给客户端,你可以试试下面的

         if (Auth::attempt(['username' => $request->username, 'password' => $request->password])) {
             $intended_url= redirect()->intended('/default')->getTargetUrl();
             $response = array(
            'status' => 'success',
            'redirectUrl' => $intended_url,
            'message' => 'Login successful.you will be redirected to home..', );
            return response()->json($response);
          } else {
              $response = array(
            'status' => 'failed',
            'message' => 'username or password is incorrect', );
           return response()->json($response);
          }
      
    • 从客户端重定向到目标网址

             success: function (data) {               
                    if(data.redirectUrl){
                    window.location.href = data.redirectUrl;
                    }
             },
      

    【讨论】:

      猜你喜欢
      • 2018-09-30
      • 2016-08-10
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多