Laravel 关系尝试获取非对象异常处理的属性“id”

问题描述 投票:0回答:3

在我的 Laravel 应用程序中,通过模型定义了许多不同类型的关系,但考虑到存在一个错误,当使用相关对象中的某些属性时(例如 $invoice->company->name),就会有不检查该关系是否存在或者我们是否获得该对象,它应该是这样的:

if($invoice->company){
     {{$invoice->company->name}}
}

但我跳过了该检查并直接访问该属性,问题是它不在一个关系中,而是在每个关系中,并且我在很多地方使用了它,因此不可能在每个地方编辑和添加检查

我尝试过这个: 在关系中,我添加了一个检查,将检查是否返回对象,如果没有返回默认虚拟对象,但这不适用,因为我必须在所有模型中的所有关系定义中执行相同的操作,因为在以下情况下这将失败像这样的:

{{$invoice->company->bank->amount}}

因为在这种情况下 amount 会抛出该错误。

我想找到一个全局解决方案,我将创建一次但它可以处理所有问题,我尝试创建一个异常处理程序,如果我收到类似尝试获取非对象属性的错误,则不是错误,而是打印 N/A 。 对基本模型进行一次修改或一次例外可能会非常有帮助。

php laravel eloquent laravel-8 laravel-blade
3个回答
0
投票

如果您的 php >= 8.0,您可以使用 null 安全运算符:(https://php.watch/versions/8.0/null-safe-operator)

{{$invoice->company?->bank?->amount}}

0
投票

有几个步骤可以帮助您解决问题。

  1. 创建一个自定义异常,当遇到错误“尝试获取非对象的属性”时将抛出该异常。然后,该异常将在您的自定义异常处理程序中被捕获并处理。
    namespace App\Exceptions;

    use Exception;

    class NonObjectPropertyException extends Exception
    {
    //
    }
  1. 自定义 Laravel 的异常处理以捕获
    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);

   }
  1. 创建一个视图,当捕获异常时,该视图将显示默认值(在本例中为“N/A”)。

  2. 要全局实现此行为,请修改其他模型扩展的基础模型。您可以在基础模型中创建一个方法来处理相关模型的属性访问,并在关系不存在时抛出

    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();
        }
    }
}

0
投票

试试这个:

{{ $invoice->company->bank->amount ?? '-' }}

或将

@
放在开头 :

{{ @$invoice->company->bank->amount }}
© www.soinside.com 2019 - 2024. All rights reserved.