iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
Modern Web

PHP框架-Symfony4 + api platform 系列 第 5

Day#5 實體類(Entity)與Symfony的生命週期(lifecycle)

記得小菜鳥說過他覺得php的Entity跟Java的java bean很像嗎?
各位看官們可能會滿頭黑人問號...心裡滿是疑問的想說你在說什麼?

簡單來說,Entity裡面放置的就是你的表單欄位,
可以利用get and set 對欄位進行取值或附值的動作,
也可以針對各個property來進行驗證 (後續會再介紹到validator的部分),
更可以使用ORM來進行欄位與資料庫的連接或是欄位之間的關聯,由於本次介紹沒有提到ORM,所以範例只會簡單的敘述

詳情可以參照symfony官方網站

https://symfony.com/doc/4.4/doctrine.html


首先,我們必須先安裝ORM這個bundle才能讓Entity裡的欄位與資料庫連接,在cmd執行下列指令

 composer require symfony/orm-pack

指令下完以後,在src目錄下的Entity目錄,建置一個class,
建置完以後,對這個class按下快捷鍵alt+insert,會看見一個orm class , 大力地給它按下去 !!
這是要做什麼呢~ 就是告訴資料庫說,欸....我們在database有這個table哦,幫我連接上去!

before:

after:

看到了嗎,94這麼方便~94這麼快速,table後面的name 要跟你所連接的dataBase 的table name一樣,
不然會爆炸給各位看哦!

接著我們必須把所需要的欄位加上去

1.給予property,名稱,欄位型態,可否為空,長度...等等

(這裡大力地提醒!! id 一定要給,一般生成策略都是用IDENTITY,因為IDENTITY會自動幫你的id每次都+1,且不會重複,當然各位看官們也可以改成其他類型的,例如Sequence 或 Custom...)

/**
 * @ORM\Entity
 * @ORM\Table(name="test_entity")
 */
class TestEntity
{

    /**
     * @var int
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(name="id", type="integer")
     */
    private $id;


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

}

column 後面的name 就是欄位在table裡的名稱,type指的是欄位型態,length是欄位長度,nullable是指可否為空,true是可以為空

property加完後,我們必須提供get and set的方法,才能進行取值及附值,大力地按下快捷鍵alt+insert

看到Getter and Setters 按下去就會自動生成function囉!!

/**
 * @ORM\Entity
 * @ORM\Table(name="test_entity")
 */
class TestEntity
{

    /**
     * @var int
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(name="id", type="integer")
     */
    private $id;


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

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

    /**
     * @param int $id
     */
    public function setId(int $id): void
    {
        $this->id = $id;
    }

    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param mixed $name
     */
    public function setName($name): void
    {
        $this->name = $name;
    }

}

這樣就完成了最基礎最基礎的entity了~接下來來介紹幾個symfony orm裡的幾個常用lifecycle,
通常這些會用在後續會提到的EevenListener(監聽器)或Entity上,寫法當然是用最黑科技的註解式寫法啦 : )

1.prePersist : 時間點會發生在每個Entity在進行持久化數據時

2.preUpdate : 時間點會在orm執行update前,也就是在更新實體類前

3.preFlush : 時間點會在進行變更的儲存前

4.onFlush : 時間點會在進行變更的儲存時

5.preRemove : 時間點會在orm執行delete前,也就是在刪除實體類前

做個小小小補充,flush可以看作是commit的意思,也就是說在這個transaction裡的動作,幫我告訴Database說我要執行,flush通常擺在所有sql條件的最後,若sql中有insert的話,要進行flush才會執行哦!!

範例一 : 使用在entity上 , 如果像以下這樣使用,我會在每次更新這個實體類前,附值給createdTime

範例二 : 使用在EventListener上,將註解放在function上,後面會介紹如何將監聽器掛在entity上使用,如果像以下 這樣使用,我會在每次這個entity在flush之前,列印1234

以上是關於實體類加上lifecycle的簡單介紹,
下一篇,嘿嘿嘿...我們要來當個偷窺狂,來監聽我們的Entity了>< , 威~ 不是啦..什麼偷窺狂,
我們只是想請Entity在特定時候幫我們做一些事情而已!!! 身為一個變態.. 阿 不是,
身為一個認真的小菜鳥工程師,我們除了要懂得使用以外,還要懂得製作,
所以下一篇~會介紹如何建立一個簡單的監聽器,然後如何套用在實體類上。

才第五篇而已....小菜鳥的精神狀態已經快分崩離析了,各種原形畢露~


上一篇
Day#4 會重工的東西來一遍就好了,不要一直跟牛魔王出來看上帝-Parameter參數
下一篇
Day#6 用監聽器(Event Listener) 來當個偷窺狂吧!!
系列文
PHP框架-Symfony4 + api platform 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言