ホームページ >バックエンド開発 >PHPチュートリアル >CodeIgniter での ORM Doctrine の紹介、codeigniterorm_PHP チュートリアル

CodeIgniter での ORM Doctrine の紹介、codeigniterorm_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-12 09:06:431050ブラウズ

CodeIgniterはORM Doctrineを導入し、codeigniterorm

は2年間CI開発を行っており、データベースの操作にはactiveRecordを使用しています。シンプルで軽くて便利です。最近のプロジェクトは私の部下に引き継がれ、データベース設計から始まる開発プロセスが採用され、現在はオンラインで稼働しています。要件の明確化、データベースの設計、CIでのモデルとコントローラーの確立、要件の変更、データベースの変更、コードの変更、要件の追加、データベースの変更などのプロセスを経てきました。振り返ってみると、グローバル コードとビジネス ロジックの要件を理解する必要があるとき、依然としてデータベースから始めなければならないことに、突然退屈を感じます。オブジェクトの属性はすべてデータベース内にあり、関連する操作はコード内にあります。 、非常に断片的に感じられます。何年も前に C# と JAVA で開発された便利な ORM フレームワークがいくつかあったことを思い出します。私にとって ORM の最大の利点は、プロジェクトの初期段階で、ニーズに応じてオブジェクトを設計できることです。変更、削除、クエリは進行中であり、データベースへのオブジェクトの追加、変更、削除、クエリも直接使用されます。オブジェクト指向。

考えられる 2 つの懸念:

  1. オブジェクトはデータベースに自動的にマッピングされる必要があるため、一連のメタデータ ルールに従うのは当然です。
  2. パフォーマンスの問題。SQL ステートメントは ORM によって自動的に生成されるため、パフォーマンスは以前ほど良くない可能性があります。ただし、フレームワークの読みやすさと保守性、およびハードウェアのパフォーマンスコストの小ささを比較すると、最初にフレームワークを選択する方が良いでしょう。さらに、ORM のパフォーマンスの 90% にはほとんど影響がないと考えられます。ORM で解決できない問題の一部は、ネイティブ SQL を使用することで解決できることもあります。

(公式参考ドキュメント: http://doctrine-orm.readthedocs.org/en/latest/tutorials/getting-started.html)

始めましょう、私たちの目標は何ですか、虫歯がないことです!まあ、これは私たちの目的の 1 つにすぎません。他にも目的があります:

  • 作成されたオブジェクトに基づいてデータベースを生成します;
  • 新しいオブジェクトを追加し、データベースに永続化します。
  • エンティティを使用すると、データ内の情報を簡単にクエリし、変更を加えることができます。

1. CI の下に Doctrine をインストールします

a. 最新の CI 3.0 はすでに Composer をサポートしています。 以下のようにアプリケーションフォルダーにcomposer.sonファイルを作成します。 (CI ルート ディレクトリにはありません)。 autoload パラメーターに注意してください (公式例の /src/ フォルダーではありません)

リーリー

注: doctrine の起動にはエンティティ ディレクトリを指定する必要があるため、上記の autoload パラメータは非常に重要です。ここでは、これを CI の model/entities ディレクトリに追加します。 /proxies ディレクトリは同時に作成され、生成されたディレクトリはデータベースからエンティティを生成するために使用され、proxies ディレクトリは遅延読み込みが生成する必要があるコードを保存するために使用されます。

b. doctrine をインストールします: インストール後のディレクトリ構造は次のとおりです:

2. ブートストラップと cli-config を設定する

Doctrine では、ブートストラップは EntityManager の作成を担当します。EntityManager は、Doctrine 全体によって提供される外部操作インターフェイスであり、エンティティのクエリ、更新、永続化を提供します。

ブートストラップでは、最初にcomposer独自の関数を使用して教義全体をロードします。 (CI 変更へのドクトリンの導入を最小限に抑えるために、コンポーザー機能はここに保持されています)

基本的なentityManagerの作成には、次の2つのステップのみが必要です:

設定を作成するにはセットアップを使用します。

  1. データベース構成オブジェクトを初期化します。
  2. データベース接続オブジェクトを使用してentityManagerを作成した後、それを使用してオブジェクトからデータベースをリバースエンジニアリングしたくなるかもしれません。焦らず、ゆっくり時間をかけてください。

CodeIgniter での ORM Doctrine の紹介、codeigniterorm_PHP チュートリアル71c555f28b58bf2a21055b54c25714fa '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 manager global $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"<span>;

</span><span>return</span> DoctrineORMToolsConsoleConsoleRunnercreateHelperSet(<span>$entityManager</span>);

 

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

 

vendor/bin/doctrine

 

其中常用的有如下:

 

vendor/bin/doctrine orm:schema-<span>tool:create

vendor</span>/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就是来干这个的。(定义的表名,对象属性对应的数据库字段名与字段属性)

 

<?<span>php
</span><span>//</span><span> src/Product.php</span><span>
/*</span><span>*
 * @Entity @Table(name="products")
 *</span><span>*/</span>
<span>class</span><span> Product
{
    </span><span>/*</span><span>* @Id @Column(type="integer") @GeneratedValue *</span><span>*/</span>
    <span>protected</span> <span>$id</span><span>;
    
    </span><span>/*</span><span>* @Column(type="string") *</span><span>*/</span>
    <span>protected</span> <span>$name</span><span>;


    </span><span>public</span> <span>function</span><span> getId()
    {
        </span><span>return</span> <span>$this</span>-><span>id;
    }

    </span><span>public</span> <span>function</span><span> getName()
    {
        </span><span>return</span> <span>$this</span>-><span>name;
    }

    </span><span>public</span> <span>function</span> setName(<span>$name</span><span>)
    {
        </span><span>$this</span>->name = <span>$name</span><span>;
    }
}</span>

 

     3. 下面我们就可以使用下面命令来进行反向工程了,是不是很兴奋!

          

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

 

     4. 下面我们就来建立一段脚本来生成一个product并将其插入数据(持久化),你就会发现如何面向对象,隐藏数据库操作的了。

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

     5. 下面我们就要使用cli来运行这段php脚本调用ORM框架来插入product了。

  1. $<span> php createproduct.php ORM 
    </span>$ php createproduct.php DBAL

查看数据库,是不是发现了新的数据已经插入了,ok大功告成。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1063520.htmlTechArticleCodeIgniter 下引入ORM Doctrine,codeigniterorm 做了两年的CI开发,一直使用activeRecord来操作数据库。简单,轻巧加方便。最近一个项目交给手下去...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。