Response.php 第 403 行中的 UnexpectedValueException - Laravel 5.1

UnexpectedValueException in Response.php line 403 - Laravel 5.1

我是 Laravel 的新手,正在构建一个小项目作为我的学校教育。我遇到了上述错误,但似乎无法修复。感谢任何帮助。

在我的控制器中,我在第一次加载页面时进行了以下调用。 getDetails 方法在页面加载时完美运行,但是当我在加载后用户与页面交互时使用 Ajax 调用它时失败并出现上述错误。

在页面加载时,该方法被调用并传递给它来自早期其他方法调用的结果值($CSpec[0]->id$CSize[0]->size_mm,我可以将其视为值 10.5) 如下:

    $CD = CS::getDetails($CSpec[0]->id, $CSize[0]->size_mm);

在控制器中我还有以下功能,它通过 Ajax 调用中使用的路由触发:

public function itemDetails($ct, $cs)
{
    return CS::getDetails($ct, $s);
}

getDetails 方法如下所示:

public static function getDetails($ct, $cs)
{
    return DB::table('recommend_view')
        ->where('recommend_view.id', '=', $ct)
        ->where('recommend_view.size_mm', '=', $cs)
        ->first();
}

我有这条路线:

Route::get('vd/cd/{cd}/{cs}',
        ['uses' => 'Application\VDController@itemDetails', 'as' => 'application.vdcdetails']);

当我使用 Ajax 调用相同的方法时,它失败并出现上述错误。 Ajax 代码在 $.getJSON 调用中生成以下 url:

http://my.app/vd/cd/1/0.5

如果我在 getDetailsdd() 每个变量,我可以看到从 url / 控制器传递给方法的正确值。

如果我在 MySQL Workbench 中执行查询,它会按预期工作:

select * 
from `recommender_view` 
where `recommender_view`.`ct_id` = 1 
and `recommender_view`.`cs_size_mm` = 0.50 
limit 1;

因此,当在初始页面加载时使用从其他方法调用直接提供给它的变量调用该方法时,该方法可以完美运行,但是当通过 URL / Ajax 传递变量时,它会失败,我似乎无法理解其中的区别。

UnexpectedValueException in Response.php line 403:
The Response content must be a string or object implementing __toString(), "object" given.

ajax 调用需要将响应传回给它。它无法识别您试图传递给它的对象。

考虑创建回复http://laravel.com/docs/5.1/responses

如果您 return 一个 json 响应例如

public function itemDetails($ct, $cs)
{
    $item = CS::getDetails($ct, $s);
    return response()->json(['data' => $item]);
}

ajax 调用应该有效。然后您可以从 ajax.

的数据变量中检索

我相信我知道你的问题是什么,但是请随时纠正我。

您使用的是 Laravel 查询生成器,它 return 是 PHP 中的一个 stdClass 对象类型,假设它为您的查询找到了一个结果集。这实际上是一个 "dumb" 对象,它没有 "echo" 或 return 的方法。您不能转换为数组,也不能转换为 json 等

因此当 Laravel 响应对象试图处理它时,它不能使用 __toString() 方法来解构适当的响应。

你最好做的是针对扩展 Illuminate Eloquent 模型 class.

的模型调用查询

在这种情况下,它可能是这样的

CableRecommenderView::where('recommend_view.id', $ct)
    ->where('recommend_view.size_mm', $cs)
    ->first();

Eloquent能够在传递给响应对象时做出相应的响应。

仅供参考,当在查询 Eloquent 中使用等号 ('=') 作为比较运算符时(可能还有查询生成器,尽管您必须对其进行检查),您可以明确放弃在 ->where() 子句中定义它并简单地将比较变量作为第二个参数传递。

希望对您有所帮助!