【问题标题】:Firing Laravel 5.4 event is causing problems in localhost触发 Laravel 5.4 事件导致 localhost 出现问题
【发布时间】:2018-07-30 20:41:03
【问题描述】:

首先你好, 我有一个我无法解决的问题。 我正在发布一个 ajax 请求,如下所示

  <script>



    $(document).ready(function(){


        $(document).on('keydown' , '.message_input', function(e){



            var token = $('input[name=_token]').val(); 
            var msg  = $(this).val(); 
            var element = $(this) ; 
            var ul = element.parent().parent().find('ul'); 
            var authenticated_user_id = $(this).attr('data-auth-id'); 
            var user_id = $(this).attr('data-to-user-id'); 
            var conversation_id = $(this).attr('data-conversation-id'); 

            if(!msg == '' && e.keyCode == 13  && !e.shiftKey){


                                 $.ajaxSetup({
                                      headers: {
                                          'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                                      }
                                  });


                                $.ajax({



                                    url : "{{ url("$lang/post_message_test")}}" ,
                                    method : 'POST',
                                    cache: false, 
                                    dataType:'JSON', 
                                    data: {   msg:msg  , authenticated_user_id:authenticated_user_id  , user_id:user_id , conversation_id: conversation_id , _token:token   },

                                    success:function(data){

                                       // my logic  
                                    }
                                });


                                return false ;    


            } 

        });

    });

</script>

这需要一个聊天控制器和一个名为 postMessage 的特定函数

结构如下

public function postMessage(Request $request ){


    if($request->ajax()){




        /** data coming from our post request with an elegant way */
        $authenticated_user_id = $request->get('authenticated_user_id'); 
        $user_id = $request->get('user_id'); 
        $conversation_id = $request->get('conversation_id');

        $msg = $request->get('msg');




        // find user image  
        $user = User::find($authenticated_user_id) ; 
        $image = asset('uploads/users/').'/'.$user->profileImage ; 




        $name = '' ; 

        if($user->userType == 'doctor'){

            $name = $user->doctorName ;
        }else{
            $name = $user->headPersonName  ; 
        }





        $message  = new Message ; 

        $message->sender_id = $authenticated_user_id ; 
        $message->receiver_id = $user_id ; 
        $message->conversation_id = $conversation_id ; 
        $message->message = $msg ; 
        $message->is_read = 'not_read'  ; 

        if($message->save()){

            $msg=Message::where('id',$message->id)
            ->select('id','message','sender_id','receiver_id','created_at')
            ->with('sender')
            ->with('receiver')
            ->first();






         $sender_name =  $msg->sender->name ; 
         $sender_image =  $msg->sender->profileImage ; 

          $dt = Carbon::now(); 

                $message_date  = $dt->diffForHumans() ; 






           event(new MessageWasRecieved( $user_id , $message->message , $image  , $authenticated_user_id , $name ));

           return Response::json([
                                    'status'=>'success'   , 
                                    'message'=>$msg->message , 
                                    'user_id'=>$user_id , 
                                    'auth_id'=>Auth::user()->id , 
                                    'image'=>$sender_image , 
                                    'name'=>$sender_name 


                                ]);



        }else{

             return Response::json([
                                    'status'=>'error'   , 



                                ]);
        }






    }


}

在这个简单的逻辑中,当它到达事件函数时,它应该触发那个事件,并且在 javascript 中等待监听这个事件。

真正发生的是,在发布到这个 url post_message_test 之后 网络选项卡中发生的事情而不是返回状态代码 200 它给了我 302 状态(检查下图)

并调用另一个名为campaign 的url(这也是在我的项目中找到的url)。我已经尝试了所有可能的注意事项,我检查了我的代码并确信每件事都运行良好

那是什么原因造成的,我希望我能正确描述我的问题
谢谢

【问题讨论】:

    标签: php laravel events pusher broadcasting


    【解决方案1】:

    状态码 302 表示重定向!不止一个 对此的解释,但通常是由于受保护的路线 用户未连接时的身份验证中间件!

    通过 XHR 请求与 laravel 通信最好的方法是使用 Laravel Passport (link here)!我已经遇到过这种问题!这个问题是 Laravel 在收到请求 ajax 时会检查标头中是否有“授权”标头,否则会重定向用户,因为对他来说他没有访问令牌

    如何安装 Laravel Passport?

    • 与作曲家运行: composer require laravel/passport
    • 然后运行:php artisan migrate 迁移护照表

    配置

    • 转到 Config/auth.php 并将 api 驱动程序更改为 passpor

      'api' => [
          'driver' => 'passport',
          'provider' => 'users',
      ],
      
      • 最后在您的用户模型中添加 HasApiTokens 特征,并在您的 AuthServicePovider 类中添加 Passport::routes():方法 boot()

    【讨论】:

    • 好的,因此我的请求是 ajax,我全部返回 {"msg":"fdfdsfsdd dfsdfd","authenticated_user_id":"1","user_id":"2","conversation_id": "4","_token":"B3jfy7nOHMcUnebqCFJxgfX4qgl37wZyYyWdFTyc"} 这是请求->all()
    • 当你把 dd() 放在你的 postMethd 开头时你得到这个结果吗?
    • 通过 XHR 请求与 laravel 通信,最好的方法是使用 Laravel Passport!我已经遇到过这种问题!这个问题是 Laravel 在收到请求 ajax 时会检查标头中是否有标头“授权”,否则会重定向用户,因为对他来说它没有访问令牌 - 我编辑我的答案并添加 Laravel 密码链接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多