浏览代码

[mapping] support for simplified file mapping drivers, closes #180

gediminasm 13 年之前
父节点
当前提交
49372a3eb1

+ 4 - 0
lib/Gedmo/Mapping/ExtensionMetadataFactory.php

@@ -143,6 +143,10 @@ final class ExtensionMetadataFactory
             }
         } else {
             $driverName = substr($driverName, 0, strpos($driverName, 'Driver'));
+            if (substr($driverName, 0, 10) === 'Simplified') {
+                // support for simplified file drivers
+                $driverName = substr($driverName, 10);
+            }
             // create driver instance
             $driverClassName = $this->extensionNamespace . '\Mapping\Driver\\' . $driverName;
             if (!class_exists($driverClassName)) {

+ 14 - 0
tests/Gedmo/Mapping/Driver/Xml/Status.orm.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
+                  xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping">
+
+    <entity name="Mapping\Fixture\Xml\Status" table="statuses">
+        <id name="id" type="integer" column="id">
+            <generator strategy="AUTO"/>
+        </id>
+
+        <field name="title" type="string" length="128"/>
+    </entity>
+
+</doctrine-mapping>

+ 26 - 0
tests/Gedmo/Mapping/Driver/Xml/Timestampable.orm.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
+                  xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping">
+
+    <entity name="Mapping\Fixture\Xml\Timestampable" table="timestampables">
+        <id name="id" type="integer" column="id">
+            <generator strategy="AUTO"/>
+        </id>
+
+        <field name="created" type="datetime">
+            <gedmo:timestampable on="create"/>
+        </field>
+        <field name="updated" type="datetime">
+            <gedmo:timestampable on="update"/>
+        </field>
+        <field name="published" type="datetime" nullable="true">
+            <gedmo:timestampable on="change" field="status.title" value="Published"/>
+        </field>
+
+        <many-to-one field="status" target-entity="Status">
+            <join-column name="status_id" referenced-column-name="id"/>
+        </many-to-one>
+    </entity>
+
+</doctrine-mapping>

+ 72 - 0
tests/Gedmo/Mapping/Xml/Simplified/TimestampableMappingTest.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace Gedmo\Mapping\Xml;
+
+use Doctrine\Common\EventManager;
+use Doctrine\ORM\Mapping\Driver\DriverChain;
+use Doctrine\ORM\Mapping\Driver\SimplifiedXmlDriver;
+use Gedmo\Timestampable\TimestampableListener;
+use Tool\BaseTestCaseORM;
+
+/**
+ * These are mapping extension tests
+ *
+ * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
+ * @package Gedmo.Mapping
+ * @link http://www.gediminasm.org
+ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
+ */
+class TimestampableMappingTest extends BaseTestCaseORM
+{
+    /**
+     * @var Gedmo\Timestampable\TimestampableListener
+     */
+    private $timestampable;
+
+    public function setUp()
+    {
+        parent::setUp();
+
+        $this->timestampable = new TimestampableListener;
+        $evm = new EventManager;
+        $evm->addEventSubscriber($this->timestampable);
+
+        $this->getMockSqliteEntityManager($evm);
+    }
+
+    protected function getMetadataDriverImplementation()
+    {
+        $xmlDriver = new SimplifiedXmlDriver(array(
+            __DIR__.'/../../Driver/Xml' => 'Mapping\Fixture\Xml'
+        ));
+
+        $chain = new DriverChain;
+        $chain->addDriver($xmlDriver, 'Mapping\Fixture\Xml');
+        return $chain;
+    }
+
+    protected function getUsedEntityFixtures()
+    {
+        return array(
+            'Mapping\Fixture\Xml\Timestampable',
+            'Mapping\Fixture\Xml\Status',
+        );
+    }
+
+    public function testTimestampableMetadata()
+    {
+        $meta = $this->em->getClassMetadata('Mapping\Fixture\Xml\Timestampable');
+        $config = $this->timestampable->getConfiguration($this->em, $meta->name);
+
+        $this->assertArrayHasKey('create', $config);
+        $this->assertEquals('created', $config['create'][0]);
+        $this->assertArrayHasKey('update', $config);
+        $this->assertEquals('updated', $config['update'][0]);
+        $this->assertArrayHasKey('change', $config);
+        $onChange = $config['change'][0];
+
+        $this->assertEquals('published', $onChange['field']);
+        $this->assertEquals('status.title', $onChange['trackedField']);
+        $this->assertEquals('Published', $onChange['value']);
+    }
+}