CodeIgniter 下引入ORM Doctrine,codeigniterorm_PHP教程

來源:互聯網
上載者:User

CodeIgniter 下引入ORM Doctrine,codeigniterorm


做了兩年的CI開發,一直使用activeRecord來操作資料庫。簡單,輕巧加方便。最近一個項目交給手下去做,也是採用從資料庫設計入手的開發流程,現在已經上線運行。經曆了理清需求,設計資料庫,在CI中建立model, controller,需求變更,更改資料庫,更改代碼,增加需求,更改資料庫等過程。回頭來看,當需要瞭解全域代碼和商務邏輯需求時,還是得從資料庫入手,突然有一種厭煩的感腳:對象的屬性都在資料庫裡,而相關的操作在代碼中,覺得很分裂。回想多年前開發的C#與JAVA中都有一些好用的ORM的架構,對我來說,ORM最大的好處是隱藏資料庫,項目前期設計時根據需求來設計對象,輕裝上陣,不必早早地陷入增改刪查中;直接利用工具將對象映射到資料庫中;資料庫的增改刪查也都是物件導向的。

可能存在的兩點顧慮:

  1. 既然要由對象自動對應到資料庫,自然要遵守一套metaData規則才行。
  2. 效能問題,由ORM自動產生sql語句,效能可能不如以前。但對比架構的可讀性/可維護性與少許的硬體效能成本,還是選擇架構優先。另外,相信ORM的90%的效能影響不大,少許的實在ORM解決不了的問題也能提供原生的sql來解決,總體來說,是利大於弊。

(官方參考文檔:http://doctrine-orm.readthedocs.org/en/latest/tutorials/getting-started.html)

開始吧,我們的目的是什麼,沒有蛀牙!好吧,這隻是我們的一個目的,還在其它的目的:

  • 根據建立的對象產生資料庫;
  • 新增對象持久化到資料庫中;
  • 能使用entity來方便查詢資料裡的資訊並達到更改。

1. 在CI下安裝doctrine

a. 最新的CI 3.0已支援composer。在application檔案夾下建立composer.son檔案如下。(不是在CI根目錄下)。 注意autoload參數(不是官方例子中的/src/檔案夾)

{    "require": {        "doctrine/orm": "2.4.*",        "symfony/yaml": "2.*"    },    "autoload": {        "psr-0": {"": "models/entities"}    }}

notes: 上面autoload參數很重要,因為doctrine的啟動需要指明entity目錄,原始例子中給定的是/src,這裡我們放在CI的model/entities目錄下,另外,同時建立model/generated 與 models/proxies目錄,generated目錄用來由資料庫產生entity,proxies目錄用來存放lazy load需要產生的程式碼.

b. 安裝doctrine: composer install. 安裝後目錄結構如下:

  

2. 配置bootstrap與cli-config

在doctrine中,bootstrap負責建立entityManager,entityManager是整個doctrine對外提供的操作介面: 隱藏資料庫介面,提供了對entity的查詢,更新及持久化。

在bootstrap中,首先使用composer內建的功能對整個doctrine實現載入。(這裡保留了composer功能,實現將doctrine引入到CI修改最小化)

建立基本的entityManager只需要兩步:

  1. 使用setup建立config。
  2. 初始化資料庫設定物件。

使用資料庫連接對象建立entityManager後我們可能及不可耐就想用來從對象來逆向工程資料庫了。別急,慢慢來。

php// bootstrap.phpuse Doctrine\ORM\Tools\Setup;use Doctrine\ORM\EntityManager;use Doctrine\Common\ClassLoader, Doctrine\DBAL\Logging\EchoSQLLogger, Doctrine\Common\Cache\ArrayCache;date_default_timezone_set("Asia/Shanghai");require_once "vendor/autoload.php";// database configuration parametersif(defined(APPPATH)){ require_once APPPATH.'config/database.php'; $conn = array( 'driver' => 'pdo_mysql', 'user' => $db['default']['username'], 'password' => $db['default']['password'], 'host' => $db['default']['hostname'], 'dbname' => $db['default']['database'] );}else{ $conn = array( 'driver' => 'pdo_mysql', 'user' => 'root', 'password' => '', 'host' => '127.0.0.1', 'dbname' => 'doctrine');}//Below can be exected in cli/*require_once APPPATH.'vendor/Doctrine/Common/lib/doctrine/common/ClassLoader.php';$doctrineClassLoader = new ClassLoader('Doctrine', APPPATH.'libraries');$doctrineClassLoader->register();$entitiesClassLoader = new ClassLoader('models', rtrim(APPPATH, "/" ));$entitiesClassLoader->register();$proxiesClassLoader = new ClassLoader('Proxies', APPPATH.'models/proxies');$proxiesClassLoader->register();*/// Create a simple "default" Doctrine ORM configuration for Annotations$isDevMode = true;$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/models/entities"), $isDevMode);// or if you prefer yaml or XML//$config = Setup::createXMLMetadataConfiguration(array(__DIR__."/config/xml"), $isDevMode);//$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yaml"), $isDevMode);$cache = new ArrayCache;$config->setMetadataCacheImpl($cache);$driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__.'/models/entities'));$config->setMetadataDriverImpl($driverImpl);$config->setQueryCacheImpl($cache);$config->setQueryCacheImpl($cache);// Proxy configuration$config->setProxyDir(__DIR__.'/models/proxies');$config->setProxyNamespace('Proxies');// Set up logger//$logger = new EchoSQLLogger;//$config->setSQLLogger($logger);$config->setAutoGenerateProxyClasses( TRUE );// obtaining the entity managerglobal $entityManager;$entityManager = EntityManager::create($conn, $config);View Code

要讓entityManager知道用哪裡的對象來進行反向工程,下面這句就尤為重要了:

$config = SetupcreateAnnotationMetadataConfiguration(array(DIR."/models/entities"), $isDevMode);

(在這裡也提一下,當從資料庫產生entity時當然也要指明entity要放在哪個檔案夾了,使用的是EntityGenerator對象,使用該對象的generate方法時指定存放的檔案夾就可以了。)

官方文檔中使用的是命令列的方法來進行反向工程的,我們這裡也依樣畫葫蘆,接下來建立必要的cli-config檔案。這個檔案相對來講就沒有bootstrap那麼長了,總公只有下面兩行即可:

requireonce "bootstrap.php";return DoctrineORMToolsConsoleConsoleRunnercreateHelperSet($entityManager);

反向工程使用vendor/bin/中的doctrine命令:

vendor/bin/doctrine

其中常用的有如下:

vendor/bin/doctrine orm:schema-tool:createvendor/bin/doctrine orm:schema-tool:update --force

notes: 使用update命令新增欄位不會影響原先的資料。

好吧,是不是急不可奈要試一試了,輸入第一條create命令,咦,不好出現一個錯誤 “No Metadata Classes to process.” ,心跳加快,冷靜,這是正常的,是因為我們還沒建立我們想要的entity呢。

建立entity進行反向工程

1. 在/models/entities中建立我們第一個entity: Product.php

注意這裡的每一個屬性都protected屬性,對應都有一對mutator(getter與setter)這是有什麼用處的呢?由官方文檔所說是用來方便doctrine來產生entity,而不是使用entity.field=foo的方式。具體在doctrine如何操作的有待進一步探索。對於主鍵Id是沒有setter方法的,你懂的。

2. 現在我們只是定義了對象,但資料庫構造是需要一些資料庫屬性的,類名與屬性前面的metadata就是來幹這個的。(定義的表名,對象屬性對應的資料庫欄位名與欄位屬性)

php// src/Product.php/** * @Entity @Table(name="products") **/class Product{    /** @Id @Column(type="integer") @GeneratedValue **/    protected $id;        /** @Column(type="string") **/    protected $name;    public function getId()    {        return $this->id;    }    public function getName()    {        return $this->name;    }    public function setName($name)    {        $this->name = $name;    }}

3. 下面我們就可以使用下面命令來進行反向工程了,是不是很興奮!

vendor/bin/doctrine orm:schema-tool:update --force --dump-sql

4. 下面我們就來建立一段指令碼來產生一個product並將其插入資料(持久化),你就會發現如何物件導向,隱藏資料庫操作的了。

  1. php require_once "bootstrap.php";$newProductName = $argv[1];$product = new Product();$product->setName($newProductName);$entityManager->persist($product);$entityManager->flush();echo "Created Product with ID " . $product->getId() . "\n";

5. 下面我們就要使用cli來運行這段php指令碼調用ORM架構來插入product了。

  1. $ php createproduct.php ORM $ php createproduct.php DBAL

查看資料庫,是不是發現了新的資料已經插入了,ok大功告成。

http://www.bkjia.com/PHPjc/1063520.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1063520.htmlTechArticleCodeIgniter 下引入ORM Doctrine,codeigniterorm 做了兩年的CI開發,一直使用activeRecord來操作資料庫。簡單,輕巧加方便。最近一個項目交給手下去...

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.