---
title: Symfony筆記
description: Symfony框架的命令、提示與提醒
cover: ../../../assets/images/memo-sf.png
---

## 建立專案

使用 [Symfony CLI](https://symfony.com/download) 工具：

```bash
symfony new project_name --version=7.4 --webapp
```

會建立一個包含 Symfony 應用程式的**資料夾**，可用習慣的編輯器開啟。

:::note

安裝後，已包含相依項，不需執行 `composer install`

:::

### 啟動開發伺服器

使用 [Symfony CLI](https://symfony.com/download) 工具：

```bash
symfony serve --no-tls
```

啟動開發伺服器，預設使用 8000 連接埠。我們可透過瀏覽器連接去應用程式：`http://localhost:8000`

:::note

若應用程式已在 8000 連接埠上執行，Symfony CLI 會自動使用 8001 連接埠，以此類推……

:::

## 建立網頁 (控制器)

有兩個方式：

- 使用 `MakerBundle` 和 `php bin/console make:controller` 指令來建立 **一個控制器類別**
- 在現有的控制器類別中，建立一個新函式，使其成為控制器，後者自帶 `Route` 屬性

### 設定路由 (網頁)

在控制器類別中函式之上，使用 `Route` 屬性：

```php
#[Route('/my-url', name: 'my_route_name')]
public function myController(): Response
{}
```

:::important

控制器會回傳一個 `Symfony\Component\HttpFoundation\Response` 類別的實體

:::

## 編輯 Twig 模板

Twig 是一個模板引擎。所有模板都位於 `templates/` 資料夾內。

網頁的外觀是從模板設計出來的（網站佈局）。

一般來說，`templates/base.html.twig` 的檔案中會有根模板。

## 安裝 Bootstrap/Tailwind

- [Bootstrap](https://getbootstrap.com/) : 可從控制台使用指令：

```bash
php bin/console importmap:require bootstrap
```

- [TailwindCSS](https://tailwindcss.com/) : 安裝套件：

```bash
composer require symfonycasts/tailwind-bundle
```

## 組態資料庫

在 `.env.local` 的檔案中，定義一個環境變數 `DATABASE_URL`。

:::note

`.env.local` 的檔案不是版本控制的。如果它不存在，則必須手動建立。

:::

### 建立資料庫

```bash
php bin/console doctrine:database:create
```

### 建立表格 (實體)

使用 `MakerBundle` 以下的指令：

```bash
php bin/console make:entity
```

:::note

也可使用這個指令來編輯已存在的實體

:::

### 建立遷移

使用 `MakerBundle` 以下的指令：

```bash
php bin/console make:migration
```

:::warning

一旦遷移建立，一定要檢查生成的程式碼，以審查哪個 SQL 程式碼將執行

:::

### 執行遷移

```bash
php bin/console d:m:m
```

:::important

遷移與**結構**相關。關於資料，可參考 Fixtures 或應用程式功能（表單、管理等等）

:::

## 安裝 Fixtures 套件

```bash
composer require --dev orm-fixtures
```

- `orm-fixtures` 是 Symfony Flex 的**別名**
- 安裝這個套件時，Symfony Flex 的**設定範本**會自動執行，以**預先組態**套件：一個 PHP 類別會在 `src/DataFixtures` 中自動建立起來

### 編輯 Fixtures

Fixtures 位於 `App\DataFixtures\AppFixtures` 類別，所以如果遵循 [PSR-4 邏輯](/zh/articles/psr#namespaces)，會在 `src/DataFixtures/AppFixtures.php` 檔案中找到 Fixtures。

另外，Fixtures 會寫在 `load` 函式中。

### 執行 Fixtures

一旦寫完 Fixtures，就可用以下指令來載入資料：

```bash
php bin/console d:f:l
```

## 建立兩個實體之間的關係

使用 `MakerBundle`，並建立一個針對目標實體的屬性。

範例：

- 編輯 `Article` 實體
- 若想建立一個連接到 `Category` 的連結，也就是說一個文章會有一個分類
- 因此我們會建立一個 `category` 屬性
- 這個屬性的類型會是 `ManyToOne`

關於類型，可用 `To` 這個關鍵字來分開不同關係的類型：

- **Many** / To / **One**
- **One** / To / **Many**
- 等等……

然後，把在編輯的實體名稱，插入到 `To` 的左邊。例如：

- **Many Articles** / To / **One**

最後，把目標實體的名稱插入到 `To` 的右邊：

- **Many Articles** / To / **One Category**
