主页/PHP笔记/PHP问答/框架Symfony/Symfony与Doctrine的CRUD操作:教程与示例

Symfony与Doctrine的CRUD操作:教程与示例

Bug编译狮

Bug编译狮

《Symfony与Doctrine的CRUD操作:教程与示例》

在现代Web开发中,数据管理是至关重要的部分。Symfony和Doctrine这两个强大的框架可以简化这一过程,帮助开发者快速创建和维护数据库表。下面,我们将通过一个简单的示例来介绍如何使用Symfony和Doctrine进行CRUD(Create, Read, Update, Delete)操作。

1. 安装Symfony和Doctrine

首先,确保你已经安装了PHP和Composer。然后,使用Composer创建一个新的Symfony项目:

composer create-project symfony/skeleton my_project --prefer-dist
cd my_project

接下来,添加 Doctrine到你的composer.json文件中:

{
    "require": {
        "symfony/framework-bundle": "^5.4",
        "doctrine/doctrine-bundle": "^2.7"
    }
}

运行 Composer更新:

composer update

2. 配置Doctrine

打开config/packages/dev/doctrine.yaml文件,并配置数据库连接:

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver: pdo_mysql
                host: localhost
                port: 3306
                dbname: my_database
                user: root
                password: ''
                charset: utf8mb4
                server_version: '5.7'
    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategies.underscore
        mappings:
            AppEntity:
                type: annotation
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity\'

3. 创建实体类

src/Entity目录下创建一个名为User.php的实体类:

<?php

namespace AppEntity;

use DoctrineORMMapping as ORM;

/**
 * @ORMEntity(repositoryClass="AppRepositoryUserRepository")
 */
class User
{
    /**
     * @ORMId()
     * @ORMGeneratedValue(strategy="AUTO")
     * @ORMColumn(type="integer")
     */
    private $id;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $username;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $email;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getUsername(): ?string
    {
        return $this->username;
    }

    public function setUsername(string $username): self
    {
        $this->username = $username;
        return $this;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;
        return $this;
    }
}

4. 创建Repository类

src/Repository目录下创建一个名为UserRepository.php的Repository类:

<?php

namespace AppRepository;

use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use SymfonyBridgeDoctrineRegistryInterface;

class UserRepository extends ServiceEntityRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, User::class);
    }

    // Add your custom query methods here
}

5. 创建控制器

src/Controller目录下创建一个名为UserController.php的控制器类:

<?php

namespace AppController;

use AppEntityUser;
use AppFormUserType;
use DoctrinePersistenceObjectManager;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentRoutingAnnotationRoute;

class UserController extends AbstractController
{
    #[Route('/user', name: 'app_user_index')]
    public function index(ObjectManager $entityManager): Response
    {
        $users = $entityManager->getRepository(User::class)->findAll();
        return $this->render('user/index.html.twig', [
            'users' => $users,
        ]);
    }

    #[Route('/user/new', name: 'app_user_new', methods: ['GET', 'POST'])]
    public function new(Request $request, ObjectManager $entityManager): Response
    {
        $user = new User();
        $form = $this->createForm(UserType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager->persist($user);
            $entityManager->flush();

            return $this->redirectToRoute('app_user_index');
        }

        return $this->render('user/new.html.twig', [
            'form' => $form->createView(),
        ]);
    }

    #[Route('/user/{id}', name: 'app_user_show', requirements: 'id=d+')]
    public function show(User $user): Response
    {
        return $this->render('user/show.html.twig', [
            'user' => $user,
        ]);
    }

    #[Route('/user/{id}/edit', name: 'app_user_edit', methods: ['GET', 'POST'])]
    public function edit(Request $request, User $user, ObjectManager $entityManager): Response
    {
        $form = $this->createForm(UserType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager->persist($user);
            $entityManager->flush();

            return $this->redirectToRoute('app_user_index');
        }

        return $this->render('user/edit.html.twig', [
            'form' => $form->createView(),
            'user' => $user,
        ]);
    }

    #[Route('/user/{id}/delete', name: 'app_user_delete', methods: ['DELETE'])]
    public function delete(Request $request, User $user, ObjectManager $entityManager): Response
    {
        $this->denyAccessUnlessGranted('ROLE_ADMIN');

        $entityManager->remove($user);
        $entityManager->flush();

        return $this->redirectToRoute('app_user_index');
    }
}

6. 创建视图

templates/user目录下创建以下视图文件:

  • index.html.twig
  • new.html.twig
  • show.html.twig
  • edit.html.twig

这些视图将负责显示用户列表、新用户表单、用户详细信息以及编辑用户的表单。

总结

通过以上步骤,我们成功地使用Symfony和Doctrine进行了基本的CRUD操作。这个示例展示了如何定义实体类、创建Repository类、编写控制器并创建相应的视图。随着项目的扩展,你可以进一步探索更多的功能和优化。

黑板Bug讲师

黑板Bug讲师

介绍

开发高效Web应用需要一个强大的框架与一个高效的ORM(对象关系映射)工具相结合。Symfony是一个受欢迎的PHP框架,而Doctrine则是一款强大的ORM。在这个教程中,我们将深入探讨如何使用Symfony和Doctrine实现CRUD操作——创建、读取、更新和删除。

CRUD 操作概述

数据操作的基本功能对于任何应用程序管理数据来说都是必不可少的。以下是每个术语的具体含义:

删除:从您的数据库中删除数据的操作。

更新:对您数据库中的现有数据进行修改操作。

读取:从数据库检索数据的行为。

创建:将新数据添加到数据库的过程。

设置 Symfony 和 Doctrine

在深入代码之前,请确保已安装Symfony。如果没有,您可以参考本教程中的Symfony安装指南:如何设置和配置Symfony。有了Symfony之后,让我们创建一个新的项目:

symfony new my_project --full

为了开始与Doctrine一起工作,请打开您的项目目录:

cd my_project

创建一个实体

一个“实体”在Doctrine中代表数据库中的一个表。假设我们要创建一个Product实体:

php bin/console make:entity Product

然后,控制台将会提示您输入用于身份验证的字段。Product实体。一旦完成,您可以为您的数据库创建相应的表:

php bin/console doctrine:migrations:migrate

该命令会生成所需的SQL查询并更新数据库。

创建操作

为了向我们的数据库添加数据,我们将创建一个新的Product使用Doctrine的EntityManager对象和持久化它:


// src/Controller/ProductController.php

use AppEntityProduct;
use DoctrineORMEntityManagerInterface;
use SymfonyComponentHttpFoundationResponse;

public function createProduct(EntityManagerInterface $entityManager): Response
{
    $product = new Product();
    $product->setName('Keyboard')->setPrice(1999);

    $entityManager->persist($product);
    $entityManager->flush();

    return new Response('Saved new product with id '.$product->getId());
}

阅读操作

读取数据涉及使用EntityManager(或Repository)来检索特定记录或一组记录:


// src/Controller/ProductController.php

use AppRepositoryProductRepository;

public function showProduct(ProductRepository $productRepository, int $productId): Response
{
    $product = $productRepository->find($productId);

    if (!$product) {
        throw $this->createNotFoundException('No product found for id '.$productId);
    }

    // ... (do something, like return a view)
}

更新操作

为了更新记录,首先通过仓库检索该项,然后进行修改并持久化:


// src/Controller/ProductController.php

public function updateProduct(EntityManagerInterface $entityManager, int $productId): Response
{
    $product = $entityManager->getRepository(Product::class)->find($productId);

    if (!$product) {
        throw $this->createNotFoundException('No product found for id '.$productId);
    }

    $product->setName('New Keyboard Name');
    $entityManager->flush();

    return new Response('Product updated!');
}

删除操作

删除记录就像检索实体并借助EntityManager将其从数据库中移除一样简单:


// src/Controller/ProductController.php

public function deleteProduct(EntityManagerInterface $entityManager, int $productId): Response
{
    $product = $entityManager->getRepository(Product::class)->find($productId);

    if ($product) {
        $entityManager->remove($product);
        $entityManager->flush();
    }

    return new Response('Product deleted if it existed.');
}

结论。

这个教程触及了Symfony和Doctrine可以一起做到的表面内容。我们学会了进行任何应用程序所需的基本CRUD操作。对于进一步的见解和高级功能,请参阅Symfony官方文档。

记住,效率来自于实践,不断根据对Symfony特性和Doctrine能力的理解来重构代码,可以确保项目灵活性和健壮性。

长工码奴1523

长工码奴1523

Symfony和Doctrine是两个常用的PHP框架,它们可以用来构建大型企业级应用。下面我们将讨论如何使用这些库来实现基本的CRUD(创建、读取、更新、删除)操作。

1. 创建数据库表

首先,我们需要定义我们的数据模型,这通常涉及到定义表结构。例如,我们有以下SQL语句:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL
);

在这个例子中,我们定义了一个名为users的表,其中包含三个字段:idnameemail。这里,id是主键,用于唯一标识每个用户;nameemail都是非空字符串类型,用于存储用户的姓名和电子邮件地址。

2. 使用 Doctrine ORM进行CRUD操作

在Symfony项目中,我们可以使用ORM(对象关系映射)功能来简化数据库操作。首先,我们需要安装ORM驱动,如 doctrine-mongodb-driver 或 doctrine-odm-orm。

接下来,我们将创建一个实体类来表示用户:

<?php

namespace AppEntity;

use DoctrineORMMapping as ORM;
use SymfonyComponentValidatorConstraints as Assert;

/**
 * @ORMEntity(repositoryClass="AppRepositoryUserRepository")
 */
class User
{
    /**
     * @ORMId()
     * @ORMGeneratedValue()
     * @ORMColumn(type="integer")
     */
    private $id;

    /**
     * @ORMColumn(type="string", length=255)
     * @AssertNotBlank(message="Name is required.")
     */
    private $name;

    /**
     * @ORMColumn(type="string", length=255, unique=true)
     * @AssertEmail(message="Invalid email format.")
     */
    private $email;

    // getters and setters...
}

现在,我们可以创建一个服务类来处理ORM操作:

<?php

namespace AppService;

use AppEntityUser;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrineCommonPersistenceManagerRegistry;

class UserRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, User::class);
    }

    public function save(User $entity, bool $flush = true): void
    {
        $this->getEntityManager()->persist($entity);
        if ($flush) {
            $this->getEntityManager()->flush();
        }
    }

    public function findOneBy(array $criteria = [], array $orderBy = []): ?User
    {
        return $this->createQueryBuilder('u')
            ->select('u')
            ->where(
                $this->expr()
                    ->in(
                        'u.email',
                        $criteria['emails']
                    )
            )
            ->addOrderBy('u.name', $orderBy['name'])
            ->getQuery()
            ->getOneOrNullResult()
        ;
    }
}

3. 实现CRUD操作

现在,让我们编写一些控制器来处理CRUD操作:

<?php

namespace AppController;

use AppEntityUser;
use AppFormUserType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;

class UserController extends AbstractController
{
    #[Route('/users', name: 'app_users')]
    public function index(): Response
    {
        $users = $this->getDoctrine()
            ->getRepository(User::class)
            ->findAll();

        return $this->render('index.html.twig', [
            'users' => $users,
        ]);
    }

    #[Route('/users/{id}', name: 'app_user_show')]
    public function show(User $user): Response
    {
        return $this->render('show.html.twig', [
            'user' => $user,
        ]);
    }

    #[Route('/users/new', name: 'app_user_new')]
    public function new(Request $request): Response
    {
        $user = new User();
        $form = $this->createForm(UserType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($user);
            $entityManager->flush();

            return $this->redirectToRoute('app_user_show', ['id' => $user->getId()]);
        }

        return $this->renderForm('new.html.twig', [
            'user' => $user,
            'form' => $form,
        ]);
    }

    #[Route('/users/{id}/edit', name: 'app_user_edit')]
    public function edit(User $user, Request $request): Response
    {
        $form = $this->createForm(UserType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $this->getDoctrine()->getManager()->flush();

            return $this->redirectToRoute('app_user_show', ['id' => $user->getId()]);
        }

        return $this->renderForm('edit.html.twig', [
            'user' => $user,
            'form' => $form,
        ]);
    }
}

示例代码

这段代码展示了如何使用Symfony和Doctrine进行CRUD操作。注意,这里的代码假设我们有一个名为doctrine-mongodb-driver的ORM驱动。如果你使用的是其他驱动,只需将DoctrineORMEntityManagerInterface替换为相应的驱动。

这个示例展示了一个简单的CRUD控制器,它允许你在浏览器上创建、显示和编辑用户记录。你可以根据需要添加更多的路由、视图和验证规则来增强此应用程序的功能。