詞彙

FQCN

FQCN (Fully Qualified Class Name) 是類別的名稱,因此類別名稱跟前面的命名空間。

例如 : Symfony\Component\HttpFoundation\Request

以上的類別名稱是 Request ,集合就組成 FQCN。

MVC

MVC 的意思是 模型 - 視圖 - 控制器

這是一個安排應用程式的方式,把應用程式分為三個部份:

  • 模型,代表數據(數據庫)
  • 視圖,為了顯示資訊(範本)
  • 控制器,包含商業邏輯(程式碼)

Type-hint

在 Symfony 的應用程式裡面,一個 type-hint 是在控制器或類別建構函式的參數可以宣告。

宣告後來會被 Symfony 分析來找到相應的服務,而對控制器或服務提供一個實例。

控制器

例如,在控制器的參數:

#[Route('/new', name: 'app_article_crud_new', methods: ['GET', 'POST'])]
public function new(
    Request $request, // <-- 特別 Type-hint : 提供進入要求
    EntityManagerInterface $entityManager, // <-- Type-hint
    SluggerInterface $slugger // <-- Type-hint
): Response
{
    //...
}

服務

class NewsletterService
{
    public function __construct(
        private MailerInterface $mailer, // <-- Type-hint
        private string $adminEmail
    ) {
    }

    //...
}

可以 type-hint autowired 類型

Slug

Slug 是一個沒有空間、重音符號、特殊字母的字串,就可以在網址或檔案名稱裡面用。

比如說一個文章的標題是:

Découvrez l'injection de dépendances dans Symfony

那相應的 slug 可能是:

decouvrez-l-injection-de-dependances-dans-symfony

也可以瀏覽以下的網址:

https://domain.com/articles/decouvrez-l-injection-de-dependances-dans-symfony

配方

配方用於安裝套件之前先安裝套件的組態。由 Symfony Flex 工具執行。

Symfony Flex 是一個 Composer 外掛程式:當用 composer require XXX 安裝套件時,Symfony Flex 會尋找套件有沒有相應的配方。配方可以包含組態檔案,或者專案內需要建立的檔案。目的是讓 Symfony 應用程式的套件整合更容易。

界面類型

在物件導向程式設計中,界面類型是一種抽象的類型:裡面只有函式的簽章。因此,所有實作的類別必須提供函式的定義。

例子

我想要開發一個通知系統。當活動發生時,我想通知使用者或管理員。

但是傳送通知的方法有多種:簡訊、郵件、手機通知等等。

所以我先會定義一個界面類型,抽象的,以描述通知系統的行為:

<?php

interface AlertInterface
{
    /**
     * 傳送通知
     */
    public function sendAlert();
}

接下來,如果我想定義怎麼傳送簡訊通知,我可以建立一個類別而實作 AlertInterface

<?php

class SmsAlert implements AlertInterface
{
    public function sendAlert()
    {
        // 傳送簡訊
    }
}

然後我也可以定義郵件通知:

<?php

class EmailAlert implements AlertInterface
{
    public function sendAlert()
    {
        // 傳送郵件
    }
}

這樣,我在 AlertInterface 裡面只會描述通知系統的行為。然後,我可以定義實作這個界面類型的類別,以實作不同的通知方式。

Polyfill

一個 polyfill 可以在特定的版本中,使用在更新的版本中出現的功能,並模擬它們。

例如,如果我在 PHP 7 中,我無法使用 PHP 8 中的功能。

但如果我用 Symfony 的 PHP 8.0 Polyfill 套件,我就可以使用 str_contains 函式,因為這個函式在 PHP 8.0 中出現,而 Symfony 已經寫了一個 polyfill 來模擬它。