Laravel条件调用视图报错:htmlspecialchars()期望字符串而非对象
问题排查与解决方案
错误原因分析
- 查询返回对象而非字符串:视图第一行使用
{{$contract_type = \App\Contract::where(['location_type' => $contract->location_type])}},where方法返回的是Eloquent查询构建器对象,而非预期的字符串类型;同时{{ }}会将变量内容输出到页面,当尝试输出对象时,htmlspecialchars()函数无法处理对象,直接抛出错误。 - 字段名拼写错误:模型中存储合同类型的字段是
type_location,但视图中误写为location_type,导致查询逻辑无效。 - 条件判断语法错误:
@if ($contract_type == contract_1)中contract_1未加引号,会被PHP解析为常量而非字符串,导致判断逻辑失效。 - Blade指令缺失:else分支中
extends('layouts.contract_2')缺少@符号,不符合Blade语法规范。
修正后的getpdf.blade.php代码
{{-- 直接使用当前$contract对象的type_location字段,无需重复查询数据库 --}} @extends('layouts.' . $contract->type_location) @section('content') <div class="content"> <div class="row"> <div class="col-lg-12"> <div class="panel panel-default"> <div class="panel-heading"> {{ trans('global.show') }} {{ trans('cruds.contract.title') }} </div> <div class="panel-body"> <div class="form-group"> <div class="form-group"> <a class="btn btn-default" href="{{ route('admin.contracts.index') }}"> {{ trans('global.back_to_list') }} </a> <a class="btn btn-default" href="{{ route('admin.contracts.getpdf', $contract->id) }}"> {{ trans('global.datatables.pdf') }} </a> </div> <table class="table table-bordered table-striped"> <tbody> <tr> <th> {{ trans('cruds.contract.fields.id') }} </th> <td> {{ $contract->id }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.user') }} </th> <td> {{ $contract->user }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.type_location') }} </th> <td> {{ App\Contract::TYPE_LOCATION_SELECT[$contract->type_location] ?? '' }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.full_name') }} </th> <td> {{ $contract->full_name }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.dob') }} </th> <td> {{ $contract->dob }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.identity') }} </th> <td> {{ $contract->identity }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.address') }} </th> <td> {{ $contract->address }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.estate_type') }} </th> <td> {{ $contract->estate_type->estate_type ?? '' }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.estate_location') }} </th> <td> {{ $contract->estate_location }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.rent_period') }} </th> <td> {{ $contract->rent_period }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.start_rent_date') }} </th> <td> {{ $contract->start_rent_date }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.end_rent_date') }} </th> <td> {{ $contract->end_rent_date }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.equipments') }} </th> <td> {{ $contract->equipments }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.superficie') }} </th> <td> {{ $contract->superficie }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.etage') }} </th> <td> {{ $contract->etage }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.porte') }} </th> <td> {{ $contract->porte }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.charges') }} </th> <td> {{ $contract->charges }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.garantie') }} </th> <td> {{ $contract->garantie }} </td> </tr> <tr> <th> {{ trans('cruds.contract.fields.attachment') }} </th> <td> @foreach($contract->attachment as $key => $media) <a href="{{ $media->getUrl() }}" target="_blank"> {{ trans('global.view_file') }} </a> @endforeach </td> </tr> </tbody> </table> <div class="form-group"> <a class="btn btn-default" href="{{ route('admin.contracts.index') }}"> {{ trans('global.back_to_list') }} </a> </div> </div> </div> </div> </div> </div> </div> @endsection
关键修改说明
- 直接使用现有对象字段:删除无效的数据库查询,直接通过
$contract->type_location获取合同类型,拼接成对应的布局视图路径,简化逻辑同时避免对象输出错误。 - 修复字段名拼写:将所有误写的
location_type修正为模型中定义的type_location。 - 简化视图继承逻辑:通过字符串拼接直接动态加载对应布局,替代冗余的if-else判断,代码更简洁高效。
- 修正Blade语法:确保所有指令符合Blade规范,避免语法错误。
内容的提问来源于stack exchange,提问作者Zack Tim
相关产品推荐
相关产品推荐

