在我的 Laravel 应用程序中,通过模型定义了许多不同类型的关系,但考虑到存在一个错误,当使用相关对象中的某些属性时(例如 $invoice->company->name),就会有不检查该关系是否存在或者我们是否获得该对象,它应该是这样的:
if($invoice->company){
{{$invoice->company->name}}
}
但我跳过了该检查并直接访问该属性,问题是它不在一个关系中,而是在每个关系中,并且我在很多地方使用了它,因此不可能在每个地方编辑和添加检查
我尝试过这个: 在关系中,我添加了一个检查,将检查是否返回对象,如果没有返回默认虚拟对象,但这不适用,因为我必须在所有模型中的所有关系定义中执行相同的操作,因为在以下情况下这将失败像这样的:
{{$invoice->company->bank->amount}}
因为在这种情况下 amount 会抛出该错误。
我想找到一个全局解决方案,我将创建一次但它可以处理所有问题,我尝试创建一个异常处理程序,如果我收到类似尝试获取非对象属性的错误,则不是错误,而是打印 N/A 。 对基本模型进行一次修改或一次例外可能会非常有帮助。
如果您的 php >= 8.0,您可以使用 null 安全运算符:(https://php.watch/versions/8.0/null-safe-operator)
{{$invoice->company?->bank?->amount}}
有几个步骤可以帮助您解决问题。
namespace App\Exceptions;
use Exception;
class NonObjectPropertyException extends Exception
{
//
}
NonObjectPropertyException
并返回默认值“N/A”而不是抛出错误。为此,您可以修改 app/Exceptions/Handler.php
文件中的渲染方法。 // app/Exceptions/Handler.php
use App\Exceptions\NonObjectPropertyException;
public function render($request, Exception $exception)
{
if ($exception instanceof NonObjectPropertyException) {
return response()->view('errors.non_object_property', [], 500);
}
return parent::render($request, $exception);
}
创建一个视图,当捕获异常时,该视图将显示默认值(在本例中为“N/A”)。
要全局实现此行为,请修改其他模型扩展的基础模型。您可以在基础模型中创建一个方法来处理相关模型的属性访问,并在关系不存在时抛出
NonObjectPropertyException
。
// app/Models/BaseModel.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Exceptions\NonObjectPropertyException;
class BaseModel extends Model
{
public function __get($key)
{
try {
return parent::__get($key);
} catch (\Exception $e) {
throw new NonObjectPropertyException();
}
}
}
试试这个:
{{ $invoice->company->bank->amount ?? '-' }}
或将
@
放在开头 :
{{ @$invoice->company->bank->amount }}