【问题标题】:Laravel - check if Ajax requestLaravel - 检查 Ajax 是否请求
【发布时间】:2015-05-27 16:51:42
【问题描述】:

我一直试图找到一种方法来确定 Laravel 中的 Ajax 调用,但我没有找到任何有关它的文档。

我有一个index() 控制器函数,我想根据请求的性质以不同的方式处理响应。基本上这是一个绑定到 GET 请求的资源控制器方法。

public function index()
{
    if(!$this->isLogin())
        return Redirect::to('login');
            
    if(isAjax()) // This is what I am needing.
    {
        return $JSON;
    }

    $data = array(
        'records' => $this->table->fetchAll()
    );

    $this->setLayout(compact('data'));
}

我知道在 PHP 中确定 Ajax 请求的其他方法,但我想要一些特定于 Laravel 的方法。

谢谢

更新:

我尝试过使用

if(Request::ajax())
{
    echo 'Ajax';
}

但我收到此错误:

Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

该类表明这不是静态方法。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    也许这会有所帮助。你必须参考@param

             /**       
             * Display a listing of the resource.
             *
             * @param  Illuminate\Http\Request $request
             * @return Response
             */
            public function index(Request $request)
            {
                if($request->ajax()){
                    return "AJAX";
                }
                return "HTTP";
            }
    

    【讨论】:

    • 你是对的。这将适用于我的情况,因为我在我的控制器中使用 Illuminate\Http\Request; 的命名空间。谢谢
    • 如果需要也可以使用“request()->ajax()”
    • 我可以确认这在 5.2 中有效。我用了助手request()->ajax()谢谢!
    【解决方案2】:

    要检查 ajax 请求,您可以使用 if (Request::ajax())

    注意: 如果您使用的是 laravel 5,则在控制器中替换

    use Illuminate\Http\Request;
    

    use Request; 
    

    我希望它会起作用。

    【讨论】:

      【解决方案3】:

      您使用了错误的Request 类。如果你想像这样使用 Facade:Request::ajax() 你必须导入这个类:

      use Illuminate\Support\Facades\Request;
      

      而不是Illumiante\Http\Request


      另一种解决方案是注入真实请求类的实例:

      public function index(Request $request){
          if($request->ajax()){
              return "AJAX";
          }
      

      (现在你必须在这里导入Illuminate\Http\Request

      【讨论】:

      • 你是对的。我修好了。其他人在上面放了一个使用声明,我没有看。谢谢:)
      【解决方案4】:

      $request->wantsJson()

      如果$request->ajax()不起作用,您可以尝试$request->wantsJson()

      $request->ajax() 在您的 JavaScript 库设置 X-Requested-With HTTP 标头时有效。

      默认情况下,Laravel 在 js/bootstrap.js 中设置此标头

      window.axios = require('axios');
      
      window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
      

      在我的例子中,我使用了不同的前端代码,我必须手动放置此标头,$request->ajax() 才能工作。

      但是$request->wantsJson() 会检查 axios 查询而不需要标头X-Requested-With

      // Determine if the current request is asking for JSON. This checks Content-Type equals application/json.
      $request->wantsJson()
      // or 
      \Request::wantsJson() // not \Illuminate\Http\Request
      

      【讨论】:

      • 如果您的控制器正在决定是否使用 JSON 或其他内容进行响应,请使用 $request->wantsJson()。这是比使用$request->isAjax() 更好的方法,因为wantsJson() 遵循Content Negotiation 的HTTP 规范。
      【解决方案5】:
      if(Request::ajax()) 
      

      看起来是正确的答案。 http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax

      【讨论】:

      • 我不确定这是否是您的意思,但 Laravel 使用了 Facade 设计模式,因此您的调用可以像静态方法一样进行:laravel.com/docs/4.2/facades#facade-class-reference 该链接显示了 Facades Laravel 的列表用途。你在控制器中使用它吗?
      • 我使用了错误的使用语句。抱歉,但感谢您对 Facades 的概述 :) 这提供了丰富的信息。
      【解决方案6】:

      对于那些使用 AngularJS 前端的人,它不使用 laravel 所期望的 Ajax 标头。 (Read more)

      对 AngularJS 使用 Request::wantsJson()

      if(Request::wantsJson()) { 
          // Client wants JSON returned 
      }
      

      【讨论】:

      • 这应该是现在的答案
      【解决方案7】:

      那些喜欢使用 laravel 助手的人可以使用 laravel request() helper 检查请求是否为 ajax。

      if(request()->ajax())
         // code
      

      【讨论】:

        【解决方案8】:
        public function index()
        {
            if(!$this->isLogin())
                return Redirect::to('login');
        
            if(Request::ajax()) // This is check ajax request
            {
              return $JSON;
            }
        
            $data = array();
            $data['records'] = $this->table->fetchAll();
        
            $this->setLayout(compact('data'));
        }
        

        【讨论】:

          【解决方案9】:

          有时候Request::ajax()不起作用,那就用\Request::ajax()

          【讨论】:

          • 如果不使用命名空间,它将不起作用。总之谢谢
          【解决方案10】:
          Do something like this
          public function functionName(User $user): string
          {
              (string) $message = "";
              // check if request is ajax
              if(request()->ajax())
              {
                  if($this->isOwner($user->id)){
                      $message = 'success';
                  }else{
                      $message = "You are unauthorized to perform this action.";
                  }
              }else{
                  $message = 'Wrong server request';
              }
              return $message;        
          }
          

          【讨论】:

            【解决方案11】:

            编写 jquery 代码后,在您的路由或控制器中执行此验证。

            $.ajax({
            url: "/id/edit",
            data:
            name:name,
            method:'get',
            success:function(data){
              console.log(data);}
            });
            
            Route::get('/', function(){
            if(Request::ajax()){
              return 'it's ajax request';}
            });
            

            【讨论】:

              【解决方案12】:

              大多数答案都可以正常工作。我们也可以查看请求头

              request()->header('Accept')=='application/json'
              

              检查请求类型

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-10-18
                • 2012-01-20
                • 2021-06-25
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多