📜  Symfony-工作示例(1)

📅  最后修改于: 2023-12-03 15:20:25.949000             🧑  作者: Mango

Symfony 工作示例

Symfony 是一款基于 PHP 的开源 Web 应用程序开发框架。它拥有良好的架构设计、丰富的文档资料和强大的社区支持,是构建高性能、可维护性和可扩展性的 Web 应用程序的首选框架之一。

在接下来的内容中,我们将会介绍一些使用 Symfony 开发 Web 应用程序的示例。

1. 创建新的 Symfony 项目

创建一个新的 Symfony 项目非常简单,只需要执行以下命令:

composer create-project symfony/website-skeleton my_project_name

这个命令将会在当前目录下创建一个名为 my_project_name 的新 Symfony 项目。其中 symfony/website-skeleton 是 Symfony 官方提供的一个基于 Webpack Encore 的骨架项目。

2. 创建一个简单的路由

Symfony 使用路由来处理 URL 请求。我们可以使用注解的方式定义路由规则,如下所示:

// src/Controller/HelloController.php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController
{
    /**
     * @Route("/hello")
     */
    public function index(): Response
    {
        return new Response('Hello, Symfony!');
    }
}

在这个示例中,我们定义了一个名为 /hello 的路由,当它被请求时,将会返回一个包含 Hello, Symfony! 字符串的响应。

3. 创建一个简单的表单

Symfony 提供了强大的表单组件,我们可以使用它来创建各种类型的表单。下面是一个使用 Symfony 表单组件创建的简单表单示例:

// src/Form/ContactType.php

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;

class ContactType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class)
            ->add('email', EmailType::class)
            ->add('message', TextareaType::class);
    }
}

我们定义了一个包含 nameemailmessage 三个字段的联系表单。接下来我们使用这个表单来渲染模板:

// src/Controller/ContactController.php

namespace App\Controller;

use App\Form\ContactType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ContactController extends AbstractController
{
    /**
     * @Route("/contact", name="contact")
     */
    public function index(Request $request): Response
    {
        $form = $this->createForm(ContactType::class);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            // 处理表单提交
        }

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

在渲染模板时,我们将表单渲染成了一个视图对象,并将其传递到模板中。接下来,我们可以在 Twig 模板中使用视图对象来渲染表单:

{# templates/contact/index.html.twig #}

<form method="post">
    {{ form_start(form) }}

    {{ form_row(form.name) }}
    {{ form_row(form.email) }}
    {{ form_row(form.message) }}

    <button type="submit">提交</button>

    {{ form_end(form) }}
</form>
4. 使用 Doctrine ORM

Symfony 集成了 Doctrine ORM,我们可以使用它来操作数据库。下面是一个使用 Doctrine ORM 创建实体类、定义映射关系和执行查询的示例:

// src/Entity/Product.php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\Column(type="integer")
     */
    private $price;

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

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getPrice(): ?int
    {
        return $this->price;
    }

    public function setPrice(int $price): self
    {
        $this->price = $price;

        return $this;
    }
}

在这个示例中,我们定义了一个名为 Product 的实体类,它包含 idnameprice 三个字段。我们还定义了它们与数据库中表的映射关系。

接下来,我们可以使用 Doctrine 查询构建器查询数据库中的数据:

// src/Controller/ProductController.php

namespace App\Controller;

use App\Entity\Product;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ProductController extends AbstractController
{
    /**
     * @Route("/product/{id}", name="product_detail")
     */
    public function detail(Product $product): Response
    {
        return $this->render('product/detail.html.twig', [
            'product' => $product,
        ]);
    }

    /**
     * @Route("/product", name="product_list")
     */
    public function list(): Response
    {
        $products = $this->getDoctrine()
            ->getRepository(Product::class)
            ->findAll();

        return $this->render('product/list.html.twig', [
            'products' => $products,
        ]);
    }
}

在这个示例中,我们定义了两个路由,一个用于显示某个产品的详细信息,另一个用于显示所有产品的列表。我们使用 Product 实体类在数据库中查询相应的数据,并将查询结果传递给相应的模板进行渲染。

5. 结语

在这个涵盖了 Symfony 基本使用方式的示例中,我们了解了如何创建新的 Symfony 项目、定义路由规则、创建表单以及使用 Doctrine 操作数据库。这些示例都只是 Symfony 框架功能的一部分,如果您想更深入地学习 Symfony,还请参阅官方文档和社区支持。