国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Symfony2中創(chuàng)建數(shù)據(jù)模型

rainyang / 1594人閱讀

摘要:今天我在這里給大家分享一下在中如何創(chuàng)建數(shù)據(jù)模型和基于的搭建。對象與數(shù)據(jù)庫的關(guān)系通常在電腦的世界里創(chuàng)建的數(shù)據(jù)模型會轉(zhuǎn)換為數(shù)據(jù)庫里的一條條記錄。

Symfony是一款優(yōu)秀的基于MVC架構(gòu)的PHP框架。今天我在這里給大家分享一下在Symfony中如何創(chuàng)建數(shù)據(jù)模型和基于RESTful api的搭建。重點是如何創(chuàng)建數(shù)據(jù)模型哦!

本教程使用的當(dāng)前Symfony的LTS版本(Symfony 2.8)

本教程開始學(xué)做日期為2016年11月

如何安裝Symfony?

同學(xué)們自己去官網(wǎng)看啦 -- Symfony官方網(wǎng)站。無論是使用Symfony installer還是Composer,在中國大陸地區(qū)下載速度會比較慢,需要使用科學(xué)的上網(wǎng)方法。

何為MVC?

MVC這一點我得重點說一下。去任何一家企業(yè)面試PHP,90%的同學(xué)會被問到什么是MVC。我相信大家已經(jīng)背得滾瓜爛熟,可以自信滿滿的回答道:MVC是三個單詞的首字母縮寫,它們是Model(模型)、View(視圖)和Controller(控制器)。Ok,面試官滿意地點點頭,進入下一個問題。但是,但是!在實際工作中,我發(fā)現(xiàn)很多同學(xué)在MVC框架下依然喜歡使用手寫sql語句進行數(shù)據(jù)庫操作。從這點來看,我個人認為這樣做的同學(xué)其實是沒有理解到MVC的,下面我就講一講我對MVC的理解。

請大家想象下圖所描繪的場景:Peter和John相隔千里,但他們可以通過互聯(lián)網(wǎng)進行溝通。抽象一點理解,Peter和John是在電腦的世界里面進行溝通。在電腦的世界里面,不再有現(xiàn)實中距離的限制,千里之外瞬息即到!模型就是現(xiàn)實對象在計算機世界里面的抽象,我們將Peter和John進行了建模,讓他們能夠進入計算機的世界。通過controller我們可以操作計算機世界里的數(shù)據(jù)模型,通過view我們可以接收計算機世界里數(shù)據(jù)模型傳達的信息。重點:模型是計算機世界里實實在在的一個對象(Object),模型是現(xiàn)實世界里一個對象在計算機世界里的抽象。

對象與數(shù)據(jù)庫的關(guān)系

通常在電腦的世界里創(chuàng)建的數(shù)據(jù)模型會轉(zhuǎn)換為數(shù)據(jù)庫里的一條條記錄。例如,我們創(chuàng)建了Peter和John這兩個數(shù)據(jù)模型,那么在數(shù)據(jù)庫的User表里面就會多出下面這兩條記錄:

| id | name  | gender | age |
| 1  | Peter | male   | 30  |
| 2  | John  | male   | 25  |

那么在MVC構(gòu)架的框架里,這兩個數(shù)據(jù)模型寫入數(shù)據(jù)庫的過程通常是這樣的:

首先,定義個一個User類(以下代碼為偽代碼)

Class User {
    public $name;
    public $gender;
    public $age;
    
    # 下面會有一堆getter和setter
}

然后實例化兩個User類

$peter = new User();
$peter->name = "Peter";
$peter->gender = "male";
$peter->age = 30;
$peter->save(); // 將Peter存入數(shù)據(jù)庫

$john = new User();
$john->name = "John";
$john->gender = "male";
$john->age = 25;
$john->save(); // 將John存入數(shù)據(jù)庫

重點來了,有些同學(xué)會說:你這樣太麻煩了,兩句sql不就搞定了嗎?!具體sql語句如下:

INSERT INTO User VALUES ("Peter", "male", 30)
INSERT INTO User VALUES ("John", "male", 25)

然而,在實際項目當(dāng)中,數(shù)據(jù)模型不可能像我剛才說的例子那么簡單,若使用手寫sql的話,就必須要再寫代碼實現(xiàn)記錄到邏輯的轉(zhuǎn)換,邏輯復(fù)雜了,工作量就會很大!但是,如果讓你手動創(chuàng)建數(shù)據(jù)模型,往往你又會覺得也是一件麻煩的事情。在有了Symfony之后,數(shù)據(jù)模型的創(chuàng)建就變得無比簡單,接下來我會用實際的例子告訴你怎么在Symfony里面快捷高效的創(chuàng)建數(shù)據(jù)模型!

設(shè)計數(shù)據(jù)模型

好了,假設(shè)我們現(xiàn)在要為一所學(xué)校做一個系統(tǒng),具體需求如下圖所示:

老師A有兩門課 - 課程A和課程B,學(xué)生A和學(xué)生B選修了課程A,學(xué)生B和學(xué)生C選修了課程B。拿到這個需求的時候,千萬不要急急忙忙的開始寫代碼,首先要做的是理清楚老師,課程還有學(xué)生之間的邏輯關(guān)系,建好數(shù)據(jù)模型。因為在邏輯都還沒有理清的情況下寫出來的代碼你覺得會沒有問題嗎?!到了那時,你會不停的進行結(jié)構(gòu)大改,把自己搞得筋疲力盡而且代碼寫的亂七八糟!

好,在了解需求之后,我們總結(jié)出以下兩點:

一個老師可以教授多門課程,但一門課程只能有一個授課老師,即老師和課程是一對多的關(guān)系,老師需要保存的字段為:姓名,性別,年齡,院系,職位,發(fā)表論文數(shù)量,課程需要保存的字段為:課程代碼,課程名稱,課程開始時間,課程結(jié)束時間。

一門課程可以被多個學(xué)生選修,一個學(xué)生也可以選修多門課程,即學(xué)生和課程是多對多的關(guān)系。學(xué)生需要保存的字段為:姓名,性別,年齡,學(xué)院,年級。

邏輯關(guān)系理清楚了,就可以開始數(shù)據(jù)建模了。我所謂的數(shù)據(jù)模型其實很簡單,就是類和類與類之間的關(guān)系的圖表,根據(jù)以上需求,我們可以創(chuàng)建如下對應(yīng)的數(shù)據(jù)模型:

上面設(shè)計的數(shù)據(jù)模型是可用的,但是我們發(fā)現(xiàn)一個問題 - 老師和學(xué)生有相同的字段,例如姓名,性別等,因為這些都是一個人基本的屬性。那么運用OOP的思想,我們眼前豁然開朗 - 老師和學(xué)生其實都是繼承了人這個對象。基于這點,我們可以優(yōu)化之前的數(shù)據(jù)模型,讓邏輯更加清晰,數(shù)據(jù)庫表里的字段不再有冗余!優(yōu)化后的數(shù)據(jù)模型如下圖所示:

到這里,數(shù)據(jù)模型已經(jīng)搭建完成,業(yè)務(wù)邏輯已經(jīng)整理完畢。可以說已經(jīng)完成了大半了工作。有的同學(xué)會說:你搞了那么半天,一點代碼都沒寫,沒有一點產(chǎn)量。那我只能回答:呵呵。下面我就實際演示一下什么是基于框架下的快速應(yīng)用開發(fā)(RAD),希望同學(xué)們可以明白咱們程序員一定要取巧,想比做更加重要,不然你一輩子都是碼農(nóng),干十年等于積累一年經(jīng)驗!

創(chuàng)建數(shù)據(jù)模型

進入symfony2的根目錄,執(zhí)行如下命令:

php app/console 

然后就會列出Symfony2所有的可用命令,我們重點關(guān)注以下兩條命令:

generate:bundle: 創(chuàng)建一個bunlde,你可以把Bundle理解成一個模塊 - 處理同一個問題的程序和資源的一個集合。Bundle和Bundle之間應(yīng)該是低耦合(最好是零耦合),這一點應(yīng)該很容易理解吧。例如一個是前端Bundle一個是后端Bundle,你要是在前端Bunlde里寫了一堆處理后端邏輯的程序,在后端Bundle里加了一些處理前端邏輯的程序。Ok,我建議你應(yīng)該先去重新理解一下編程的思想。為什么說可以做到零耦合呢?因為在Symfony2里面一些多個Bundle都會調(diào)用的方法可以注冊成Service,而不需要直接到方法所在的Bundle里去調(diào)用。

doctrine:generate:entity: 生成一個模型,entity就是實體模型的意思。

首先使用 php app/console generate:bundle 生成一個名為Backend的Bundle,生成步驟如下圖:

接著,使用 php app/console doctrine:generate:entity 生成數(shù)據(jù)模型,根據(jù)提示來一步一步來,很簡單的!例如下圖演示了如何生成學(xué)生數(shù)據(jù)模型:

進行如上操作之后,可以發(fā)現(xiàn)在項目目錄結(jié)構(gòu)下已經(jīng)多了一個叫BackendBundle的文件夾,并且4個數(shù)據(jù)模型已經(jīng)建好了,如下圖所示:

接著,我們需要手動調(diào)整一下Symfony2幫我們自動生成的這4個數(shù)據(jù)模型。

數(shù)據(jù)表屬性命名規(guī)范

在Symfony2 entity類中,屬性名若由多個單詞組成,一般使用大寫字母分隔,例如:finishAt。而在數(shù)據(jù)表中,屬性名若由多個單詞組成,一般使用下劃線分隔,例如:finish_at。查看自動生成的數(shù)據(jù)模型的屬性,具體格式如下:

/**
 * @var DateTime
 *
 * @ORMColumn(name="startFrom", type="datetime")
 */
 private $startFrom;

可以發(fā)現(xiàn),每一個屬性上面都有一堆注釋,但這一堆注釋不同于普通的注釋,因為它其實就是一段程序,因為我們在生成BackendBundle的時候Configuration format選擇的是annotation。在Symfony2中,路由注冊,變量類型定義,數(shù)據(jù)庫屬性定義等都可以通過annotation的方式。特別是在路由注冊的時候,我特別偏好于annotation的方式,因為它是離散型的,就像一個標(biāo)簽一樣貼在了所作用屬性或控制器的上面。有其他框架開發(fā)經(jīng)驗的同學(xué)們應(yīng)該知道在其他框架中,注冊的路由通常會被寫在一個文件里面,比如在Yii2 basic中,所有注冊路由都在config/web.php的urlManager中。我曾經(jīng)接手了一個基于Yii2 basic的項目,一打開路由配置文件,發(fā)現(xiàn)里面有一千多行注冊路由的代碼,而且之前注冊這些路由的程序員根本就沒正確理解路由的注冊,搞得配置文件亂七八糟,每次打開這個文件心里就會有一種很不爽的感覺,程序員的潔癖呀!還有一點就是,在團隊合作中,這種中心配置文件肯定會被不同的程序員編輯,合并時發(fā)生沖突的可能大大增加,如果是Git還好一點,但如果你還用SVN,你就等著哭吧。好了,不吐槽了,我簡單講解一下上面的那一段代碼,@var定義了$startFrom為DateTime類型,@ORMColumn定義了數(shù)據(jù)表中,屬性名為startFrom,類型為datetime。我們只需要修改一下數(shù)據(jù)表中的屬性名就可以統(tǒng)一數(shù)據(jù)庫表屬性命名規(guī)范:

/**
 * @var DateTime
 *
 * @ORMColumn(name="start_from", type="datetime")
 */
 private $startFrom;
數(shù)據(jù)模型驗證

驗證就是指檢查傳遞過來的數(shù)據(jù)是否正確,例如之前的startFrom是一個DateTime類型,如果傳遞一個string類型過來,肯定是不正確的。在Symfony2中,在每個屬性的annotation就可以定義驗證條件,詳情可見 Symfony Validation。下面舉兩個例子說明一下:

/**
 * @var string
 *
 * 不能為空
 * @AssertNotBlank()
 * 值必須為Male或Female
 * @AssertChoice({"Male", "Female"})
 *
 * @ORMColumn(name="gender", type="string", length=255)
 */
 private $gender;
/**
 * @var string
 *
 * 不能為空
 * @AssertNotBlank()
 * 值類型需為string型
 * @AssertType("string")
 *
 * @ORMColumn(name="name", type="string", length=255)
 */
 private $name;
自動時間戳屬性

在數(shù)據(jù)模型中,一般我們會默認加入兩個時間戳屬性 - createdAt(創(chuàng)建于)和updatedAt(更新于),這兩個屬性顯然不應(yīng)該是由我們傳值的,而是在記錄生成和更新的時候自動將當(dāng)時的時間存下來。對于這個問題,StofDoctrineExtensionsBundle這個第三方Bundle已經(jīng)給我們提供了完美的解決方案。

提示:為什么我們喜歡用流行的第三方框架,應(yīng)為流行的第三方框架有自己的社區(qū),有一大幫程序員不停的在為社區(qū)的壯大獻出自己的一份力。很多時候,很多問題其實都是別人已經(jīng)解決過了的。所以,我們在遇到一個問題的時候,要多去社區(qū)里面找找成熟的解決方案,而不是關(guān)上門重復(fù)的造輪子。

Symfony官方幫我們總結(jié)出了最火的30個第三方Bundle,有興趣的可以看一下,說不定會有驚喜哦!

首先,用Composer下載這個第三方Bundle:

composer require stof/doctrine-extensions-bundle

然后,啟用和配置Bundle:

// app/AppKernel.php

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...

            new StofDoctrineExtensionsBundleStofDoctrineExtensionsBundle(),
        );

        // ...
    }

    // ...
}
// app/config/config.yml
stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            timestampable: true

最后,在createdAt和updatedAt屬性上面用Annotation的方法進行配置即可:

use GedmoMappingAnnotation as Gedmo;

// ...

/**
 * @var DateTime
 *
 * @GedmoTimestampable(on="create")
 * @ORMColumn(name="created_at", type="datetime")
 */
 private $createdAt;

/**
 * @var DateTime
 *
 * @GedmoTimestampable(on="update")
 * @ORMColumn(name="updated_at", type="datetime")
 */
 private $updatedAt;
建立模型與模型之間的關(guān)系

之前我們已經(jīng)總結(jié)出了數(shù)據(jù)模型之間的關(guān)系,現(xiàn)在讓我們再回顧一下:

Teacher與Course的關(guān)系為一對多

Student與Course的關(guān)系為多對多

Teacher和Student都繼承Person類

具體實現(xiàn)如下:

// src/BackendBundle/Entity/Course.php

use DoctrineCommonCollectionsArrayCollection;

// ...
class Course {
  // ...

  /**
   * @var Teacher
   *
   * @ORMManyToOne(targetEntity="Teacher", inversedBy="courses")
   * @ORMJoinColumn(name="teacher_id", referencedColumnName="id")
   */
  private $teacher;

  /**
   * @ORMManyToMany(targetEntity="Student", inversedBy="courses")
   * @ORMJoinTable(name="course_student")
   */
  private $students;

  public function __construct()
  {
    $this->students = new ArrayCollection();
  }

  // ...
}
// src/BackendBundle/Entity/Teacher.php

use DoctrineCommonCollectionsArrayCollection;

// ...
class Teacher extends Person {

  // ...
  
  /**
   * @ORMOneToMany(targetEntity="Course", mappedBy="teacher")
   */
  private $courses;

  public function __construct()
  {
    $this->courses = new ArrayCollection();
  }

  // ...
}
// src/BackendBundle/Entity/Student.php

use DoctrineCommonCollectionsArrayCollection;

// ...
class Student extends Person {

  // ...
  
  /**
   * @ORMManyToMany(targetEntity="Course", mappedBy="students")
   */
  private $courses;

  public function __construct()
  {
    $this->courses = new ArrayCollection();
  }

  // ...
}
// src/BackendBundle/Entity/Person.php

/**
 * Person
 *
 * @ORMTable(name="person")
 * @ORMEntity(repositoryClass="BackendBundleRepositoryPersonRepository")
 * @ORMInheritanceType("JOINED")
 */
abstract class Person
{
  // ...
}

然后運行php app/console doctrine:generate:entities BackendBundle生成剛才我們加入的自定義屬性的getter和setter。之后,運行php app/console doctrine:schema:update --force,數(shù)據(jù)表就已經(jīng)成功生成了,趕快去數(shù)據(jù)庫里面看看吧。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22004.html

相關(guān)文章

  • 讓Vagrant支持在Windows的同步共享文件中創(chuàng)軟鏈接

    摘要:第三步,測試是否可以創(chuàng)建軟鏈接不過硬鏈接是不行的誰知道怎么實現(xiàn),還好大部分項目都不需要用到硬鏈接第四步,測試創(chuàng)建個項目附上文本形式的配置 samba在windows下居然比nfs快很多倍(這太不科學(xué)了,windows的nfs是不是故意做得這么垃圾),而且非常穩(wěn)定,推薦用samba代替nfs,samba解決了開發(fā)環(huán)境問題,哈哈哈哈哈哈哈,2015年11月2日 19:43:42 updat...

    Snailclimb 評論0 收藏0
  • PHP路由性能測試

    摘要:路由控制器性能測試前言前段時間抽空寫了個微型路由控制器可以在我的另一篇文章里面看到詳細的介紹。上門有測試以及這幾個路由控制器的性能,總體來說和在最壞的情況下表現(xiàn)最好。同樣的測試條件。所以本次測試僅僅針對,以及。 PHP路由控制器性能測試 前言 前段時間抽空寫了個微型路由控制器可以在我的另一篇文章里面看到詳細的介紹。雖然在設(shè)計的時候及盡量避開了正則匹配和數(shù)組循環(huán)這種耗時的操作。盡量節(jié)省時...

    levy9527 評論0 收藏0
  • Linux 安裝 Symfony2.8

    摘要:環(huán)境說明操作系統(tǒng)安裝準備均使用安裝至少要有個的環(huán)境是少不了了安裝步驟下載官方命令工具創(chuàng)建項目這里執(zhí)行項目創(chuàng)建時,會從官網(wǎng)下載源碼包,執(zhí)行完后就能在當(dāng)前目錄看到了這里我創(chuàng)建了一個新的項目叫,最后的不是項目名字中的是要下載指定的版本的源 環(huán)境說明 操作系統(tǒng) tony@ubuntu:~$ lsb_release -a No LSB modules are available. Distrib...

    Yang_River 評論0 收藏0
  • Symfony2.8 源碼分析之類的加載

    摘要:今天來寫寫這個框架的類加載機制版本原理在項目啟動時,通過注冊了要使用的類的自動加載處理方法,在類第一次被使用的時候,類文件通過該方法被引入,然后類才得以使用源碼分析在的入口文件,我們找到我們隨著這個路徑我們找打了這個主要內(nèi)容如下其中是為了注 今天來寫寫Symfony2.8 這個框架的類加載機制 版本 Symfony 2.8 原理 在項目啟動時,Symfony 通過spl_autoloa...

    Blackjun 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<