在我的Laravel应用程序中,有很多不同类型的关系定义在模型上,但在视图中有一个错误,当使用相关对象中的某些属性时(如$invoice->company->name),没有检查该关系是否存在或我们是否得到该对象,它应该是这样的:
if($invoice->company){
{{$invoice->company->name}}
}
但我跳过了该检查并直接访问该属性,问题是它不是在一个关系中,而是在每个关系中,我在很多地方都使用了它,因此不可能在每个地方编辑和添加检查
我试过这个:在关系中,我添加了一个检查,它将检查对象是否返回,如果不是,则返回默认的虚拟对象,但这不适用,因为我必须在所有模型中的所有关系定义中执行相同的操作,因为在这样的情况下会失败:
{{$invoice->company->bank->amount}}
因为在这种情况下,amount会抛出错误。
我想找到一个全局的解决方案,我将创建一次,但它处理所有,我试图做一个异常处理程序,如果我得到错误,如尝试获取非对象的属性,那么而不是错误,只是打印N/A。在基本模型中的单个修改可能是或单个例外将是非常有帮助的。
4条答案
按热度按时间smdncfj31#
让我们更好地理解这个问题
你所指的问题不是一个laravel问题这是一个php问题提出的异常是
ErrorException
因为最有可能的是你试图访问null
的属性这与laravel无关Laravel用来解析属性和关系的神奇get方法
__get
已经处理了,如果属性或关系不存在,它将返回null
所以当你使用
$invoice->company
时,你必须知道$company
是一个eloquent
对象,所以当你使用->company
时,它会调用__get
方法,它会返回null
,到目前为止没有问题。但是一旦你做了
$invoice->company->name
,现在$invoice->company
是null
,而不是eloquent
对象,所以当你做->name
时,没有对__get
或任何东西的调用,因为没有对象所以你可以做的是通过定义关系的默认模型来从laravel默认关系中受益https://laravel.com/docs/10.x/eloquent-relationships#default-models所以当关系没有定义时,laravel不会返回null,它将返回一个默认的有说服力的模型,它可以处理没有设置的子属性
slmsl1lt2#
如果你的php >= 8.0,你可以使用null安全操作符:(https://php.watch/versions/8.0/null-safe-operator)
2w3kk1z53#
有几个步骤可以帮助解决您的问题。
1.创建一个自定义异常,当您遇到错误“Trying to get property of non-object"时将引发该异常。这个异常将在你的自定义异常处理器中被捕获和处理。
1.自定义Laravel的异常处理来捕获
NonObjectPropertyException
并返回默认值“N/A”,而不是抛出错误。为此,可以修改app/Exceptions/Handler.php
文件中的render方法。1.创建一个在捕获异常时显示默认值(本例中为“N/A”)的视图。
1.要全局实现此行为,请修改其他模型扩展的基础模型。您可以在基础模型中创建一个方法,该方法将处理相关模型的属性访问,并在关系不存在时抛出
NonObjectPropertyException
。vmjh9lq94#
试试这个:
或者把
@
放在开头: