예제 #1
0
 public function __construct()
 {
     // load database configuration from CodeIgniter
     require APPPATH . 'config/database.php';
     //A Doctrine Autoloader is needed to load the models
     // first argument of classloader is namespace and second argument is path
     // setup models/entity namespace
     $entityLoader = new ClassLoader('models', APPPATH);
     $entityLoader->register();
     foreach (glob(APPPATH . 'modules/*', GLOB_ONLYDIR) as $m) {
         $module = str_replace(APPPATH . 'modules/', '', $m);
         $entityLoader = new ClassLoader($module, APPPATH . 'modules');
         $entityLoader->register();
     }
     //Register proxies namespace
     $proxyLoader = new ClassLoader('Proxies', APPPATH . 'Proxies');
     $proxyLoader->register();
     // Set up caches
     $config = new Configuration();
     $cache = new ArrayCache();
     $config->setMetadataCacheImpl($cache);
     $driverImpl = $config->newDefaultAnnotationDriver(array(APPPATH . 'models'));
     $config->setMetadataDriverImpl($driverImpl);
     $config->setQueryCacheImpl($cache);
     // Set up entity
     $reader = new AnnotationReader($cache);
     $models = array(APPPATH . 'models');
     foreach (glob(APPPATH . 'modules/*/models', GLOB_ONLYDIR) as $m) {
         array_push($models, $m);
     }
     $driver = new AnnotationDriver($reader, $models);
     $config->setMetadataDriverImpl($driver);
     // Setup Gedmo
     $cachedAnnotationReader = new Doctrine\Common\Annotations\CachedReader($reader, $cache);
     // create a driver chain for metadata reading
     $driverChain = new Doctrine\ORM\Mapping\Driver\DriverChain();
     // load superclass metadata mapping only, into driver chain
     // also registers Gedmo annotations.NOTE: you can personalize it
     Gedmo\DoctrineExtensions::registerAbstractMappingIntoDriverChainORM($driverChain, $cachedAnnotationReader);
     $event = new EventManager();
     $timestampableListener = new TimestampableListener();
     $timestampableListener->setAnnotationReader($cachedAnnotationReader);
     $event->addEventSubscriber($timestampableListener);
     $slugListener = new SluggableListener();
     $slugListener->setAnnotationReader($cachedAnnotationReader);
     $event->addEventSubscriber($slugListener);
     // Proxy configuration
     $config->setProxyDir(APPPATH . '/proxies');
     $config->setProxyNamespace('Proxies');
     // Set up logger
     // $logger = new EchoSQLLogger;
     // $config->setSQLLogger($logger);
     $config->setAutoGenerateProxyClasses(TRUE);
     // Database connection information
     $connectionOptions = array('driver' => 'pdo_mysql', 'user' => $db['default']['username'], 'password' => $db['default']['password'], 'host' => $db['default']['hostname'], 'dbname' => $db['default']['database']);
     // Create EntityManager
     $this->em = EntityManager::create($connectionOptions, $config, $event);
 }
예제 #2
0
 protected function setUp()
 {
     parent::setUp();
     $evm = new EventManager();
     $sluggableListener = new SluggableListener();
     $sluggableListener->addManagedFilter(self::SOFT_DELETEABLE_FILTER_NAME, true);
     $evm->addEventSubscriber($sluggableListener);
     $this->softDeleteableListener = new SoftDeleteableListener();
     $evm->addEventSubscriber($this->softDeleteableListener);
     $config = $this->getMockAnnotatedConfig();
     $config->addFilter(self::SOFT_DELETEABLE_FILTER_NAME, 'Gedmo\\SoftDeleteable\\Filter\\SoftDeleteableFilter');
     $this->em = $this->getMockSqliteEntityManager($evm, $config);
     $this->em->getFilters()->enable(self::SOFT_DELETEABLE_FILTER_NAME);
 }
예제 #3
0
 /**
  * Transliterates the slug and prefixes the slug
  * by collection of parent slugs
  *
  * @param string $text
  * @param string $separator
  * @param object $object
  * @return string
  */
 public function transliterate($text, $separator, $object)
 {
     $slug = call_user_func_array($this->originalTransliterator, array($text, $separator, $object));
     if (strlen($this->parentSlug)) {
         $slug = $this->parentSlug . $this->usedPathSeparator . $slug;
     }
     $this->sluggable->setTransliterator($this->originalTransliterator);
     return $slug;
 }
 /**
  * {@inheritDoc}
  */
 public function onSlugCompletion(SluggableAdapter $ea, array &$config, $object, &$slug)
 {
     $this->om = $ea->getObjectManager();
     $isInsert = $this->om->getUnitOfWork()->isScheduledForInsert($object);
     if (!$isInsert) {
         $options = $config['handlers'][get_called_class()];
         $wrapped = AbstractWrapper::wrapp($object, $this->om);
         $oldSlug = $wrapped->getPropertyValue($config['slug']);
         $mappedByConfig = $this->sluggable->getConfiguration($this->om, $options['relationClass']);
         if ($mappedByConfig) {
             $meta = $this->om->getClassMetadata($options['relationClass']);
             if (!$meta->isSingleValuedAssociation($options['mappedBy'])) {
                 throw new InvalidMappingException("Unable to find " . $wrapped->getMetadata()->name . " relation - [{$options['mappedBy']}] in class - {$meta->name}");
             }
             if (!isset($mappedByConfig['slugs'][$options['inverseSlugField']])) {
                 throw new InvalidMappingException("Unable to find slug field - [{$options['inverseSlugField']}] in class - {$meta->name}");
             }
             $mappedByConfig['slug'] = $mappedByConfig['slugs'][$options['inverseSlugField']]['slug'];
             $mappedByConfig['mappedBy'] = $options['mappedBy'];
             $ea->replaceInverseRelative($object, $mappedByConfig, $slug, $oldSlug);
             $uow = $this->om->getUnitOfWork();
             // update in memory objects
             foreach ($uow->getIdentityMap() as $className => $objects) {
                 // for inheritance mapped classes, only root is always in the identity map
                 if ($className !== $mappedByConfig['useObjectClass']) {
                     continue;
                 }
                 foreach ($objects as $object) {
                     if (property_exists($object, '__isInitialized__') && !$object->__isInitialized__) {
                         continue;
                     }
                     $oid = spl_object_hash($object);
                     $objectSlug = $meta->getReflectionProperty($mappedByConfig['slug'])->getValue($object);
                     if (preg_match("@^{$oldSlug}@smi", $objectSlug)) {
                         $objectSlug = str_replace($oldSlug, $slug, $objectSlug);
                         $meta->getReflectionProperty($mappedByConfig['slug'])->setValue($object, $objectSlug);
                         $ea->setOriginalObjectProperty($uow, $oid, $mappedByConfig['slug'], $objectSlug);
                     }
                 }
             }
         }
     }
 }
 /**
  * @test
  */
 public function shouldBeAbleToMapSluggableMetadata()
 {
     $meta = $this->em->getClassMetadata('Mapping\\Fixture\\Xml\\Sluggable');
     $config = $this->sluggable->getConfiguration($this->em, $meta->name);
     $this->assertArrayHasKey('slug', $config['slugs']);
     $this->assertCount(1, $config['slugs']);
     $config = $config['slugs']['slug'];
     $this->assertEquals('slug', $config['slug']);
     $this->assertArrayHasKey('style', $config);
     $this->assertEquals('camel', $config['style']);
     $this->assertArrayHasKey('updatable', $config);
     $this->assertFalse($config['updatable']);
     $this->assertArrayHasKey('unique', $config);
     $this->assertTrue($config['unique']);
     $this->assertArrayHasKey('separator', $config);
     $this->assertEquals('_', $config['separator']);
     $this->assertArrayHasKey('fields', $config);
     $this->assertCount(3, $config['fields']);
     $fields = $config['fields'];
     $this->assertEquals('title', $fields[0]);
     $this->assertEquals('ean', $fields[1]);
     $this->assertEquals('code', $fields[2]);
     $this->assertArrayHasKey('handlers', $config);
     $this->assertEquals(2, count($config['handlers']));
     $handlers = $config['handlers'];
     $this->assertArrayHasKey('Gedmo\\Sluggable\\Handler\\TreeSlugHandler', $handlers);
     $this->assertArrayHasKey('Gedmo\\Sluggable\\Handler\\RelativeSlugHandler', $handlers);
     $first = $handlers['Gedmo\\Sluggable\\Handler\\TreeSlugHandler'];
     $this->assertEquals(2, count($first));
     $this->assertArrayHasKey('parentRelationField', $first);
     $this->assertArrayHasKey('separator', $first);
     $this->assertEquals('parent', $first['parentRelationField']);
     $this->assertEquals('/', $first['separator']);
     $second = $handlers['Gedmo\\Sluggable\\Handler\\RelativeSlugHandler'];
     $this->assertEquals(3, count($second));
     $this->assertArrayHasKey('relationField', $second);
     $this->assertArrayHasKey('relationSlugField', $second);
     $this->assertArrayHasKey('separator', $second);
     $this->assertEquals('parent', $second['relationField']);
     $this->assertEquals('test', $second['relationSlugField']);
     $this->assertEquals('-', $second['separator']);
 }
예제 #6
0
 /**
  * Transliterates the slug and prefixes the slug
  * by collection of parent slugs
  *
  * @param string $text
  * @param string $separator
  * @param object $object
  * @return string
  */
 public function transliterate($text, $separator, $object)
 {
     $slug = call_user_func_array($this->originalTransliterator, array($text, $separator, $object));
     // For tree slugs, we "urlize" each part of the slug before appending "/"
     $slug = Urlizer::urlize($slug, $separator);
     if (strlen($this->parentSlug)) {
         $slug = $this->parentSlug . $this->usedPathSeparator . $slug;
     }
     $this->sluggable->setTransliterator($this->originalTransliterator);
     return $slug;
 }
예제 #7
0
 /**
  * Transliterates the slug and prefixes the slug
  * by collection of parent slugs
  *
  * @param string $text
  * @param string $separator
  * @param object $object
  * @return string
  */
 public function transliterate($text, $separator, $object)
 {
     $slug = call_user_func_array(
         $this->originalTransliterator,
         array($text, $separator, $object)
     );
     if (strlen($this->parentSlug)) {
         $options = $this->getOptions($object);
         $slug = $this->parentSlug . $options['separator'] . $slug;
     }
     $this->sluggable->setTransliterator($this->originalTransliterator);
     return $slug;
 }
 /**
  * Transliterates the slug and prefixes the slug
  * by relative one
  *
  * @param string $text
  * @param string $separator
  * @param object $object
  * @return string
  */
 public function transliterate($text, $separator, $object)
 {
     $result = call_user_func_array($this->originalTransliterator, array($text, $separator, $object));
     $wrapped = AbstractWrapper::wrapp($object, $this->om);
     $relation = $wrapped->getPropertyValue($this->usedOptions['relationField']);
     if ($relation) {
         $wrappedRelation = AbstractWrapper::wrapp($relation, $this->om);
         $slug = $wrappedRelation->getPropertyValue($this->usedOptions['relationSlugField']);
         $result = $slug . $this->usedOptions['separator'] . $result;
     }
     $this->sluggable->setTransliterator($this->originalTransliterator);
     return $result;
 }
 /**
  * @test
  */
 public function shouldBeAbleToMapSluggableMetadata()
 {
     $meta = $this->em->getClassMetadata('Mapping\\Fixture\\Xml\\Sluggable');
     $config = $this->sluggable->getConfiguration($this->em, $meta->name);
     $this->assertArrayHasKey('slug', $config['slugs']);
     $this->assertCount(1, $config['slugs']);
     $config = $config['slugs']['slug'];
     $this->assertEquals('slug', $config['slug']);
     $this->assertArrayHasKey('style', $config);
     $this->assertEquals('camel', $config['style']);
     $this->assertArrayHasKey('updatable', $config);
     $this->assertFalse($config['updatable']);
     $this->assertArrayHasKey('unique', $config);
     $this->assertTrue($config['unique']);
     $this->assertArrayHasKey('separator', $config);
     $this->assertEquals('_', $config['separator']);
     $this->assertArrayHasKey('fields', $config);
     $this->assertCount(3, $config['fields']);
     $fields = $config['fields'];
     $this->assertEquals('title', $fields[0]);
     $this->assertEquals('ean', $fields[1]);
     $this->assertEquals('code', $fields[2]);
 }
 public function testSluggableMetadata()
 {
     $meta = $this->em->getClassMetadata('Mapping\\Fixture\\Xml\\Sluggable');
     $config = $this->sluggable->getConfiguration($this->em, $meta->name);
     $this->assertArrayHasKey('slugFields', $config);
     $this->assertEquals('slug', $config['slugFields']['slug']['slug']);
     $this->assertArrayHasKey('style', $config['slugFields']['slug']);
     $this->assertEquals('camel', $config['slugFields']['slug']['style']);
     $this->assertArrayHasKey('updatable', $config['slugFields']['slug']);
     $this->assertTrue($config['slugFields']['slug']['updatable']);
     $this->assertArrayHasKey('unique', $config['slugFields']['slug']);
     $this->assertTrue($config['slugFields']['slug']['unique']);
     $this->assertArrayHasKey('separator', $config['slugFields']['slug']);
     $this->assertEquals('_', $config['slugFields']['slug']['separator']);
     $this->assertArrayHasKey('fields', $config);
     $this->assertEquals(3, count($config['fields']['slug']));
     $fields = $config['fields'];
     $this->assertEquals('title', $fields['slug'][0]['field']);
     $this->assertEquals(0, $fields['slug'][0]['position']);
     $this->assertEquals('code', $fields['slug'][1]['field']);
     $this->assertEquals(false, $fields['slug'][1]['position']);
     $this->assertEquals('ean', $fields['slug'][2]['field']);
     $this->assertEquals(1, $fields['slug'][2]['position']);
 }
예제 #11
0
 /**
  * {@inheritDoc}
  */
 public function postSlugBuild(SluggableAdapter $ea, array &$config, $object, &$slug)
 {
     $this->sluggable->setTransliterator(array($this, 'transliterate'));
 }
 /**
  * @param EventManager           $manager
  * @param EntityManagerInterface $em
  * @param Reader                 $reader
  */
 public function addSubscribers(EventManager $manager, EntityManagerInterface $em, Reader $reader)
 {
     $subscriber = new SluggableListener();
     $subscriber->setAnnotationReader($reader);
     $manager->addEventSubscriber($subscriber);
 }
예제 #13
0
 protected function getNamespace()
 {
     return parent::getNamespace();
 }
예제 #14
0
 /**
  *
  * @return EntityManager
  */
 public function getEntityManager()
 {
     $cache = new DoctrineCache\ArrayCache();
     $annotationReader = new AnnotationReader();
     $cachedAnnotationReader = new CachedReader($annotationReader, $cache);
     // create a driver chain for metadata reading
     $driverChain = new MappingDriverChain();
     // load superclass metadata mapping only, into driver chain
     // also registers Gedmo annotations.NOTE: you can personalize it
     Gedmo\DoctrineExtensions::registerAbstractMappingIntoDriverChainORM($driverChain, $cachedAnnotationReader);
     // now we want to register our application entities,
     // for that we need another metadata driver used for Entity namespace
     $annotationDriver = new AnnotationDriver($cachedAnnotationReader, $this->paths);
     $driverChain->addDriver($annotationDriver, $this->namespace);
     // general ORM configuration
     $isDevMode = $this->env != "production";
     $config = DoctrineSetup::createAnnotationMetadataConfiguration($this->paths, $isDevMode);
     $config->setMetadataCacheImpl($cache);
     $config->setQueryCacheImpl($cache);
     $config->setMetadataDriverImpl($driverChain);
     $config->setProxyDir($this->proxy_path);
     $config->setProxyNamespace($this->namespace . '\\Proxy');
     $config->setAutoGenerateProxyClasses($isDevMode);
     // Third, create event manager and hook prefered extension listeners
     $evm = new EventManager();
     // gedmo extension listeners
     // sluggable
     $sluggableListener = new Gedmo\Sluggable\SluggableListener();
     // you should set the used annotation reader to listener, to avoid creating new one for mapping drivers
     $sluggableListener->setAnnotationReader($cachedAnnotationReader);
     $evm->addEventSubscriber($sluggableListener);
     // tree
     $treeListener = new Gedmo\Tree\TreeListener();
     $treeListener->setAnnotationReader($cachedAnnotationReader);
     $evm->addEventSubscriber($treeListener);
     // loggable, not used in example
     $loggableListener = new Gedmo\Loggable\LoggableListener();
     $loggableListener->setAnnotationReader($cachedAnnotationReader);
     $loggableListener->setUsername('unknown');
     $evm->addEventSubscriber($loggableListener);
     // timestampable
     $timestampableListener = new Gedmo\Timestampable\TimestampableListener();
     $timestampableListener->setAnnotationReader($cachedAnnotationReader);
     $evm->addEventSubscriber($timestampableListener);
     // blameable
     $blameableListener = new Gedmo\Blameable\BlameableListener();
     $blameableListener->setAnnotationReader($cachedAnnotationReader);
     $blameableListener->setUserValue('unknown');
     // determine from your environment
     $evm->addEventSubscriber($blameableListener);
     // translatable - buggy !!!
     /*
     $translatableListener = new Gedmo\Translatable\TranslatableListener();
     // current translation locale should be set from session or hook later into the listener
     // most important, before entity manager is flushed
     $translatableListener->setTranslatableLocale('en');
     $translatableListener->setDefaultLocale('en');
     $translatableListener->setAnnotationReader($cachedAnnotationReader);
     $evm->addEventSubscriber($translatableListener);
     */
     // sortable, not used in example
     $sortableListener = new Gedmo\Sortable\SortableListener();
     $sortableListener->setAnnotationReader($cachedAnnotationReader);
     $evm->addEventSubscriber($sortableListener);
     // mysql set names UTF-8 if required
     $evm->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\MysqlSessionInit());
     // Finally, create entity manager
     return EntityManager::create($this->dbParams, $config, $evm);
 }