Bladeren bron

Add mongodb support

Lionel Raggini 13 jaren geleden
bovenliggende
commit
5fc3b0e806

+ 55 - 0
Admin/Document/GroupAdmin.php

@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Sonata package.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sonata\UserBundle\Admin\Document;
+
+use Sonata\AdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Form\FormMapper;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Route\RouteCollection;
+
+class GroupAdmin extends Admin
+{
+    protected $formOptions = array(
+        'validation_groups' => 'Registration'
+    );
+
+    public function getNewInstance()
+    {
+        $class = $this->getClass();
+
+        return new $class('', array());
+    }
+
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('name')
+            ->add('roles')
+        ;
+    }
+
+    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
+    {
+        $datagridMapper
+            ->add('name')
+        ;
+    }
+    
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->add('name')
+            ->add('roles', 'sonata_security_roles', array( 'multiple' => true, 'required' => false))
+        ;
+    }
+}

+ 91 - 0
Admin/Document/UserAdmin.php

@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * This file is part of the Sonata package.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sonata\UserBundle\Admin\Document;
+
+use Sonata\AdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Form\FormMapper;
+use Sonata\AdminBundle\Datagrid\DatagridMapper;
+use Sonata\AdminBundle\Datagrid\ListMapper;
+use Sonata\AdminBundle\Route\RouteCollection;
+use Sonata\AdminBundle\Security\Acl\Permission\MaskBuilder;
+
+use FOS\UserBundle\Model\UserManagerInterface;
+
+class UserAdmin extends Admin
+{
+    protected $formOptions = array(
+        'validation_groups' => 'Profile'
+    );
+
+    protected function configureListFields(ListMapper $listMapper)
+    {
+        $listMapper
+            ->addIdentifier('username')
+            ->add('email')
+            ->add('enabled')
+            ->add('locked')
+            ->add('createdAt')
+        ;
+
+        if ($this->isGranted('ROLE_ALLOWED_TO_SWITCH')) {
+            $listMapper
+                ->add('impersonating', 'string', array('template' => 'SonataUserBundle:Admin:Field/impersonating.html.twig'))
+            ;
+        }
+    }
+
+    protected function configureDatagridFilters(DatagridMapper $filterMapper)
+    {
+        $filterMapper
+            ->add('username')
+            ->add('locked')
+            ->add('email')
+            ->add('id')
+        ;
+    }
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->with('General')
+                ->add('username')
+                ->add('email')
+                ->add('plainPassword', 'text', array('required' => false))
+            ->end()
+            ->with('Groups')
+                ->add('groups', 'sonata_type_model', array('required' => false))
+            ->end()
+            ->with('Management')
+                ->add('roles', 'sonata_security_roles', array( 'multiple' => true, 'required' => false))
+                ->add('locked', null, array('required' => false))
+                ->add('expired', null, array('required' => false))
+                ->add('enabled', null, array('required' => false))
+            ->end()
+        ;
+    }
+
+    public function preUpdate($user)
+    {
+        $this->getUserManager()->updateCanonicalFields($user);
+        $this->getUserManager()->updatePassword($user);
+    }
+
+    public function setUserManager(UserManagerInterface $userManager)
+    {
+        $this->userManager = $userManager;
+    }
+
+    public function getUserManager()
+    {
+        return $this->userManager;
+    }
+}

+ 11 - 3
DependencyInjection/Configuration.php

@@ -28,6 +28,8 @@ class Configuration implements ConfigurationInterface
         $treeBuilder = new TreeBuilder();
         $rootNode = $treeBuilder->root('sonata_user');
 
+        $supportedManagerTypes = array('orm', 'mongodb');
+
         $rootNode
             ->children()
                 ->booleanNode('security_acl')->defaultValue(false)->end()
@@ -37,11 +39,17 @@ class Configuration implements ConfigurationInterface
                         ->scalarNode('user_group')->defaultValue('fos_user_user_group')->end()
                     ->end()
                 ->end()
+                ->scalarNode('manager_type')
+                    ->defaultValue('orm')
+                    ->validate()
+                        ->ifNotInArray($supportedManagerTypes)
+                        ->thenInvalid('The manager type %s is not supported. Please choose one of '.json_encode($supportedManagerTypes))
+                    ->end()
+                ->end()
                 ->arrayNode('class')
-                    ->addDefaultsIfNotSet()
                     ->children()
-                        ->scalarNode('group')->defaultValue('Application\\Sonata\\UserBundle\\Entity\\Group')->end()
-                        ->scalarNode('user')->defaultValue('Application\\Sonata\\UserBundle\\Entity\\User')->end()
+                        ->scalarNode('group')->end()
+                        ->scalarNode('user')->end()
                     ->end()
                 ->end()
             ->end()

+ 29 - 3
DependencyInjection/SonataUserExtension.php

@@ -39,13 +39,15 @@ class SonataUserExtension extends Extension
         $config = $processor->processConfiguration($configuration, $configs);
 
         $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
-        $loader->load('admin_orm.xml');
+        $loader->load(sprintf('admin_%s.xml', $config['manager_type']));
         $loader->load('form.xml');
 
         if ($config['security_acl']) {
             $loader->load('security_acl.xml');
         }
 
+        $config = $this->addDefaults($config);
+
         $this->registerDoctrineMapping($config);
         $this->configureClass($config, $container);
 
@@ -56,6 +58,24 @@ class SonataUserExtension extends Extension
         ));
     }
 
+    /**
+     * @param array $config
+     * @return array
+     */
+    public function addDefaults(array $config)
+    {
+        if ('orm' === $config['manager_type']) {
+            $modelType = 'Entity';
+        } elseif ('mongodb' === $config['manager_type']) {
+            $modelType = 'Document';
+        }
+
+        $defaultConfig['class']['user']  = sprintf('Application\\Sonata\\UserBundle\\%s\\User', $modelType);
+        $defaultConfig['class']['group'] = sprintf('Application\\Sonata\\UserBundle\\%s\\Group', $modelType);
+
+        return array_merge($defaultConfig, $config);
+    }
+
     /**
      * @param $config
      * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
@@ -63,8 +83,14 @@ class SonataUserExtension extends Extension
      */
     public function configureClass($config, ContainerBuilder $container)
     {
-        $container->setParameter('sonata.user.admin.user.entity', $config['class']['user']);
-        $container->setParameter('sonata.user.admin.group.entity', $config['class']['group']);
+        if ('orm' === $config['manager_type']) {
+            $modelType = 'entity';
+        } elseif ('mongodb' === $config['manager_type']) {
+            $modelType = 'document';
+        }
+
+        $container->setParameter(sprintf('sonata.user.admin.user.%s', $modelType), $config['class']['user']);
+        $container->setParameter(sprintf('sonata.user.admin.group.%s', $modelType), $config['class']['group']);
     }
 
     /**

+ 23 - 0
Document/BaseGroup.php

@@ -0,0 +1,23 @@
+<?php
+/*
+ * This file is part of the Sonata project.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+
+namespace Sonata\UserBundle\Document;
+
+use FOS\UserBundle\Document\Group as AbstractedGroup;
+
+class BaseGroup extends AbstractedGroup
+{
+
+    public function __toString()
+    {
+        return $this->getName();
+    }
+}

+ 100 - 0
Document/BaseUser.php

@@ -0,0 +1,100 @@
+<?php
+/*
+ * This file is part of the Sonata project.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+
+namespace Sonata\UserBundle\Document;
+
+use FOS\UserBundle\Document\User as AbstractedUser;
+
+class BaseUser extends AbstractedUser
+{
+    protected $createdAt;
+
+    protected $updatedAt;
+
+    /**
+     * Set createdAt
+     *
+     * @param \DateTime|null $createdAt
+     * @return void
+     */
+    public function setCreatedAt(\DateTime $createdAt = null)
+    {
+        $this->createdAt = $createdAt;
+    }
+
+    /**
+     * Get createdAt
+     *
+     * @return \DateTime|null
+     */
+    public function getCreatedAt()
+    {
+        return $this->createdAt;
+    }
+
+    /**
+     * Set updatedAt
+     *
+     * @param \DateTime|null $updatedAt
+     * @return void
+     */
+    public function setUpdatedAt(\DateTime $updatedAt = null)
+    {
+        $this->updatedAt = $updatedAt;
+    }
+
+    /**
+     * Get updatedAt
+     *
+     * @return \DateTime|null
+     */
+    public function getUpdatedAt()
+    {
+        return $this->updatedAt;
+    }
+
+    /**
+     * @return void
+     */
+    public function prePersist()
+    {
+        $this->createdAt = new \DateTime;
+        $this->updatedAt = new \DateTime;
+    }
+
+    /**
+     * @return void
+     */
+    public function preUpdate()
+    {
+        $this->updatedAt = new \DateTime;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getUsername() ?: '-';
+    }
+
+    /**
+     * Set related groups
+     *
+     * @param aarrat $groups
+     */
+    public function setGroups($groups)
+    {
+        foreach ($groups as $group){
+            $this->addGroup($group);
+        }
+    }
+}

+ 45 - 0
Resources/config/admin_mongodb.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<container xmlns="http://symfony.com/schema/dic/services"
+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <!-- USER -->
+        <parameter key="sonata.user.admin.user.class">Sonata\UserBundle\Admin\Document\UserAdmin</parameter>
+        <parameter key="sonata.user.admin.user.controller">SonataAdminBundle:CRUD</parameter>
+        <parameter key="sonata.user.admin.user.translation_domain">SonataUserBundle</parameter>
+
+        <!-- GROUP -->
+        <parameter key="sonata.user.admin.group.class">Sonata\UserBundle\Admin\Document\GroupAdmin</parameter>
+        <parameter key="sonata.user.admin.group.controller">SonataAdminBundle:CRUD</parameter>
+        <parameter key="sonata.user.admin.group.translation_domain">%sonata.user.admin.user.translation_domain%</parameter>
+
+        <parameter key="sonata.user.admin.groupname">sonata_user</parameter>
+    </parameters>
+
+    <services>
+        <service id="sonata.user.admin.user" class="%sonata.user.admin.user.class%">
+            <tag name="sonata.admin" manager_type="doctrine_mongodb" group="%sonata.user.admin.groupname%" label="users" label_translator_strategy="sonata.admin.label.strategy.underscore" />
+            <argument />
+            <argument>%sonata.user.admin.user.document%</argument>
+            <argument>%sonata.user.admin.user.controller%</argument>
+            <call method="setUserManager">
+                <argument type="service" id="fos_user.user_manager" />
+            </call>
+            <call method="setTranslationDomain">
+                <argument>%sonata.user.admin.user.translation_domain%</argument>
+            </call>
+        </service>
+
+        <service id="sonata.user.admin.group" class="%sonata.user.admin.group.class%">
+            <tag name="sonata.admin" manager_type="doctrine_mongodb" group="%sonata.user.admin.groupname%" label="groups" label_translator_strategy="sonata.admin.label.strategy.underscore" />
+            <argument />
+            <argument>%sonata.user.admin.group.document%</argument>
+            <argument>%sonata.user.admin.group.controller%</argument>
+            <call method="setTranslationDomain">
+                <argument>%sonata.user.admin.group.translation_domain%</argument>
+            </call>
+        </service>
+    </services>
+
+</container>

+ 12 - 0
Resources/config/doctrine/BaseGroup.mongodb.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
+                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
+                  http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
+
+    <mapped-superclass name="Sonata\UserBundle\Document\BaseGroup">
+
+
+    </mapped-superclass>
+
+</doctrine-mapping>

+ 17 - 0
Resources/config/doctrine/BaseUser.mongodb.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
+                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
+                  http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
+
+    <mapped-superclass name="Sonata\UserBundle\Document\BaseUser">
+        <field name="createdAt" type="date" />
+        <field name="updatedAt" type="date" />
+
+        <lifecycle-callbacks>
+            <lifecycle-callback type="prePersist" method="prePersist" />
+            <lifecycle-callback type="preUpdate" method="preUpdate" />
+        </lifecycle-callbacks>
+    </mapped-superclass>
+
+</doctrine-mapping>