Api Symfony-如果找不到实体,则添加回调

Api Symfony-如果找不到实体,则添加回调,api,symfony,events,doctrine,Api,Symfony,Events,Doctrine,我为某事挣扎了好几天。我正在使用API来存储有关食品的数据。 我想做的是: 用户正在寻找产品(使用条形码) 我们在数据库中搜索产品 如果什么也没有找到,那么我们就访问API来检索信息,并将它们保存在数据库中 然后我们像往常一样处理加载的实体 如果数据库中不存在实体,是否有方法(事件或其他)添加行为 提前感谢未经测试的代码演示了流程 在您的存储库中: public function findByEAN(string $ean): Product { $product = $this->

我为某事挣扎了好几天。我正在使用API来存储有关食品的数据。 我想做的是:

  • 用户正在寻找产品(使用条形码)
  • 我们在数据库中搜索产品
  • 如果什么也没有找到,那么我们就访问API来检索信息,并将它们保存在数据库中
  • 然后我们像往常一样处理加载的实体
  • 如果数据库中不存在实体,是否有方法(事件或其他)添加行为


    提前感谢未经测试的代码演示了流程

    在您的存储库中:

    public function findByEAN(string $ean): Product
    {
        $product = $this->findOnyBy(['ean' => $ean]);
        if ($product === null) {
            throw new EntityNotFoundException(sprintf('No Product with EAN %s', $ean);
        }
    
        return $product;
    }
    
    在控制器操作中:

    try {
        $product = $this->getEntityManager()->getRepository(Product::class)->findByEan($request->get('ean'));
    } catch (EntityNotFoundException $e) {
        $product = '' ; // fetch product via api and store in DB
    }
    
    return $product;
    

    如果api抛出未找到的异常,则可以使用try-and-catch方法。你能展示一个试图查找产品的api控制器吗?不是api必须抛出not found异常。当产品在本地(在我们的数据库中)找不到时,我们使用外部API获取信息。谢谢您的回答。我也考虑过这个解决方案,但实际上,它并不真正合适,因为您必须在每个存储库方法中添加此行为。因此,我试图找到一种更好、更通用的方法来实现这一点。这是一个简化的例子——我有一个抽象的基本存储库,其中包含两种常用的方法。因此,基本的findBy*和find*方法被重写为所有抛出异常的方法,而不只是返回null。其他方法在所有情况下都会返回一个对象——如果找不到,就创建一个新的对象。是的,但仍然是。开发人员必须始终考虑这一点。最好的方法是使用like ANOTION指定在数据为null时使用的方法。通过这种方式,我们可以将“条令回购方法”和“api回购方法”分开。我认为最佳做法是使用
    ProductManager
    类,该类使用实体管理器和api服务。每一个find方法都经过manager——如果没有找到任何产品,它将调用api。所以你有一个中心点为所有的开发者。我喜欢这样!非常感谢:)