两个 symfony 7 应用程序使用同一个数据库,可能吗?

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

我设计了一个 symfony 应用程序 A,其数据库名为“bdd”,其中包含实体“entityA”。我想为第二个应用程序 B 使用相同的数据库并访问数据库“bdd”的实体“entityA”。请问如何进行?

举一个简单的例子,我想为电子商务网站的送货人员创建一个并行应用程序,他们必须登录才能管理送货。

php database-design symfony7
1个回答
0
投票

是的,绝对有可能让两个 Symfony 7 应用程序使用同一个数据库。在您的电子商务场景中,您希望为送货人员创建一个并行应用程序来管理送货,这种方法可以很好地发挥作用。以下是如何进行:

  1. 数据库配置

对于您的主要电子商务应用程序 (A) 和送货人员应用程序 (B),将数据库连接配置为使用相同的 bdd 数据库:

两个应用程序的 .env 文件

DATABASE_URL="mysql://username:[email protected]:3306/bdd"
  1. 共享实体A 实体

您有两种在应用程序之间共享实体A的选项:

选项 1:复制实体

将实体A类从应用程序A复制到应用程序B。确保两个应用程序中的实体映射(注释、属性或YAML)相同。

选项 2:创建共享包(推荐)

创建一个单独的 Composer 包,其中包含实体 A 和任何其他共享实体。 将此包托管在私有存储库中(例如,在 GitHub 上)。 两个应用程序都需要该包:

jsonCopy{
    "require": {
        "your-vendor/shared-entities": "^1.0"
    }
}

在两个应用程序中运行

composer require your-vendor/shared-entities

这种方法减少了重复并确保了应用程序之间的一致性。

  1. 用户认证

配送人员登录:

  1. 在两个应用程序中使用相同的用户实体。

  2. 确保两个应用程序使用兼容的安全配置(例如密码散列、身份验证提供程序)。

  3. 实施基于角色的访问 控制以限制交付人员使用相关功能。

    // 具有角色的用户实体示例 使用 Symfony\Component\Security\Core\User\UserInterface;

    类 User 实现 UserInterface { // ...

    private array $roles = [];
    
    public function getRoles(): array
    {
        $roles = $this->roles;
        $roles[] = 'ROLE_USER';
    
        return array_unique($roles);
    }
    
    // ...
    

    }

  4. 处理并发数据访问

实施锁定机制来管理并发访问,对于交付状态更新尤其重要:

乐观锁定

向可能同时修改的实体添加版本字段:

use Doctrine\ORM\Mapping as ORM;

class Delivery
{
    // ...

    #[ORM\Version]
    #[ORM\Column(type: 'integer')]
    private $version;

    // ...
}

悲观锁定

用于可能引起冲突的操作:

$entityManager = $this->getDoctrine()->getManager();
$delivery = $entityManager->find(Delivery::class, $id, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);

// Update delivery status
// ...

$entityManager->flush();
  1. 安全考虑

实施适当的访问控制,确保送货人员只能访问和修改相关数据。

使用特定于环境的配置来管理生产和开发环境之间的不同数据库访问级别。

  1. 性能优化

实施缓存策略,尤其是对于读取密集型操作。 针对经常访问的数据优化数据库查询和索引。 如果读取操作比写入频繁得多,请考虑为交付应用程序使用只读副本。

  1. 数据库迁移 仔细管理数据库架构更改:

指定一个应用程序(最好是主要的电子商务应用程序)作为迁移的主要来源。 进行更改时,请确保两个应用程序均已更新以使用最新架构。

© www.soinside.com 2019 - 2024. All rights reserved.