【问题标题】:Laravel 5 `Internal Server Error` (500) with Ajax form submission带有 Ajax 表单提交的 Laravel 5 `Internal Server Error` (500)
【发布时间】:2018-04-25 03:00:57
【问题描述】:

我在Laravel 5 项目中提交的ajax 表单存在问题。我的浏览器控制台出现以下错误:

 Failed to load resource: the server responded with a status of 500 (Internal Server Error)

我尝试了许多在其他帖子和网站上找到的建议,但都没有成功。这是我的 Ajax:

$.ajax({'url': './subscribe' 
    ,'data' : {
                "_token": $('meta[name="csrf-token"]').attr('content')
                ,"email" : $('#subscribe-email-input').val() 
            }
    ,'method': 'POST' 
    ,'success': function(data){
        console.log( data );
    }
    ,'error': function(data){
        console.log( 'oops', data );
    }
});

我的routes/web.php 文件中定义了以下路线:

Route::post('subscribe', ['uses' => 'SubscribeController@validate', 'as' => 'subscribe.route']);

而且控制器非常简单:

class SubscribeController extends Controller
{   
    /*
    *   Get email address from DB if exists
    *
    *   @param string email, email address to search and return data from DB
    *
    *   @returns $email
    */
    public function validate ( Request $request )
    {
        $email = addslashes($request->email) ;

        if ( $email ) 
        {           
            $email = \App\Subscribe::where('email', '=', $email)->get();

            if ( $email->isEmpty() ) 
            {
                self::executeInsertQuery ( $email );
                return json_encode( array('body' => 'You have subscribed!') );
            } else {
                return json_encode( array('body' => 'You are already subscribed!') );
            }

        }       
    }
}

我会在self::executeInsertQuery(...) 中发布代码,但考虑到subscribe 路由似乎甚至没有到达validate 方法,我认为它不相关。

任何关于如何解决问题的建议或意见将不胜感激!!提前谢谢!

【问题讨论】:

  • @KirkBeard 这个特定错误似乎不会导致插入新的日志条目

标签: php ajax laravel-5 http-status-code-500


【解决方案1】:

问题是 validate 函数是 Laravel 控制器中的预定义方法,因此您覆盖它会导致问题。尝试将其更改为其他内容。

【讨论】:

  • 这解决了我的问题。显然,根据错误, validate 是基类 Controller 中的保留方法。我将方法名称从 validate 更改为 verifySubscribe,一切正常!!
【解决方案2】:

试试

return response()->json([
    'body' => 'You have subscribed!'
]);

https://laravel.com/docs/5.6/responses#other-response-types

【讨论】:

  • 我更新了它以使用它,但我仍然遇到同样的错误
  • 尝试在函数中注释所有其他行,只需保留return json测试并查看日志
【解决方案3】:
  • 首先,在没有ajax的情况下发送表单并验证它是否记录了发送的数据,然后,在它的ajax函数中,将参数“method”:“POST”更改为“type”:“POST”并尝试再次。注意:jquery 3.0 之前的版本需要指明类型,否则默认会发送 GET。

  • 其次,将名称方法“validate”更改为“validateSuscriber”,因为Controller类已经有一个“validate”方法,并且有两个相等的方法会产生冲突。

【讨论】:

  • 谢谢,我尝试导航到没有 Ajax 的路由(使用浏览器中的路由),它把我路由到 Laravel MethodNotAllowedHTTPException 页面。我也尝试将method 切换为type 并没有修复错误
  • 不要忘记在表单中添加 csrf_field(),如果你是在没有 ajax 的情况下发送它。还有:
  • 好吧,我使用表单操作和方法手动发布并删除了 Ajax 调用。现在我将此重定向到 Laravel 错误页面,并显示以下消息:Declaration of App\Http\Controllers\SubscribeController::validate(Illuminate\Http\Request $request) should be compatible with App\Http\Controllers\Controller::validate(Illuminate\Http\Request $request, array $rules, array $messages = Array, array $customAttributes = Array)
  • 将方法名“validate”改成“validateSuscriber”,因为根据报错,Controller方法已经有方法与之冲突了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2015-09-15
  • 2013-09-20
  • 1970-01-01
相关资源
最近更新 更多