2017-08-22 42 views
1

的想法是這樣的麻煩。在表'驅動程序'中,我有描述'驅動程序'的字段,但是我需要存儲另外一組大約100的字段,我不需要將其作爲表格列。所以我決定將它們存儲在Jsonb領域。我需要能夠使用這些領域作爲模型領域,但他們需要被自動保存在一個JSONB領域..當我從表中選擇我需要這個領域來顯示像表中的其他領域。POMM2在Symfony3項目,註冊轉換器

我已經檢查了有關文件轉換器和發現PgJson轉換器。所以我認爲這是處理這個問題的正確工具,但我目前還沒有設法正確配置。

我曾嘗試註冊場「testinfo」被註冊爲SessionBuilder轉換器類型「extrainfo」,但沒有成功。來自PG和PG的方法不被調用。這裏我展示了我的項目文件中的例子。

composer.json

... 
"require": { 
    "php": ">=7.0.0", 
    ... 
    "pomm-project/pomm-bundle": "^2.3", 
    "sensio/distribution-bundle": "^5.0.19", 
    "sensio/framework-extra-bundle": "^3.0.2", 
    ... 
    "symfony/symfony": "3.3.6", 
    ... 
    "vibby/pomm-project-fos-user-bundle": "dev-master" 
}, 
... 

CREATE TABLE public.driver 
(
    driver_id bigint NOT NULL DEFAULT nextval('driver_driver_id_seq'::regclass), 
    account_id integer NOT NULL, 
    infodata jsonb, -- large number of fields,... 
    weight jsonb, -- weights for fields that are not in jsonb field 
    ssn character varying, 
    signature character varying 
    -- ... 
) 

config.yml

pomm: 
configuration: 
    driversdb: 
     dsn: "pgsql://%db_user2%:%db_password2%@%db_host2%:%db_port2%/%db_name2%" 
     #session_builder: "pomm.session_builder" 
     pomm:default: true 
     session_builder: 'AppBundle\Model\Driversdb\SessionBuilder' 

services.yml

... 
drivertojson: 
    class: AppBundle\Service\DriverToJson 
    tags: 
     - { name: pomm.model, converter: pomm.model } 

AppBundle\Model\Driversdb\SessionBuilder: 
    autowire: true 
... 

/src/AppBundle/Model/Driversdb/SessionBuilder.php

namespace AppBundle\Model\Driversdb; 

use AppBundle\Service\DriverToJson;   //Exact Copy of Pomm PgJson converter. 
use PommProject\Foundation\Converter\PgJson; 
use PommProject\Foundation\Session\Session; 
use PommProject\ModelManager\SessionBuilder as BaseSessionBuilder; 

class SessionBuilder extends BaseSessionBuilder 
{ 
    protected function postConfigure(Session $session) { 
     parent::postConfigure($session); 

     $session 
      ->getPoolerForType('converter') 
      ->getConverterHolder() 
      ->registerConverter('extrainfo', new DriverToJson(), ['infodata', 'public.driver.infodata']) // register Jsonb converter 
      ->addTypeToConverter('extrainfo', 'extrainfo', false) // convert a domain of point 
     ; 
    } 
} 

/src/AppBundle/Model/Driversdb/PublicSchema/Driver.php

namespace AppBundle\Model\Driversdb\PublicSchema; 

use PommProject\ModelManager\Model\FlexibleEntity; 

/** 
* Driver 
* Flexible entity for relation 
* public.driver 
* @see FlexibleEntity 
*/ 
class Driver extends FlexibleEntity 
{ 
    public $keyForId = 'driver_id'; 

    public function getId() { 
     return $this->get($this->keyForId); 
    } 

    public function __toString() { 
     return $this->getSsn(); 
    } 

    private $driver_id; 
    private $account_id; 
    private $infodata; 
    private $weight; 
    private $ssn; 
    private $signature; 
    //... 
    private $testinfo; 

    public function getTestinfo() { 
     if ($this->has('testinfo')) { 
      return $this->get('testinfo'); 
     } else { 
      return ''; 
     } 
    } 

    public function getDriverId() { 
     if ($this->has('driver_id')) { 
      return $this->get('driver_id'); 
     } else { 
      return ''; 
     } 
    } 

    public function getAccountId() { 
     if ($this->has('account_id')) { 
      return $this->get('account_id'); 
     } else { 
      return ''; 
     } 
    } 
//... 

/SRC /的appbundle/CONTR奧勒/ DriverController.php

namespace AppBundle\Controller; 

use AppBundle\Form\DriverFormType; 
use AppBundle\Model\Driversdb\PublicSchema\Driver; 
use AppBundle\Model\Driversdb\PublicSchema\DriverModel; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\Form\Exception\InvalidArgumentException; 
use Symfony\Component\HttpFoundation\Request; 
use AppBundle\Service\DriverToJson; 

class DriverController extends Controller 
{ 
//... 
/** 
    * @Route("/driver", name="driver_create") 
    * @Method ("POST") 
    * @Template("@App/Driver/new.html.twig") 
    * @param Request $request 
    * @return \Symfony\Component\HttpFoundation\RedirectResponse 
    * @throws \Exception 
    */ 
    public function createAction(Request $request){ 
     $driver = new Driver(); 
     $form = $this->createForm(DriverFormType::class, $driver,[ 
      'action'=> $this->generateUrl('driver_create'), 
      'method'=> 'POST' 
     ]); 

     $form->handleRequest($request); 
     if($form->isValid()){ 
      $driver = $form->getData(); 
      try{ 
       /** @var DriverModel $driverModel */ 
       $driverModel = $this->get('pomm')['driversdb']->getModel(DriverModel::class); 
       $driverModel->insertOne($driver); 
       return $this->redirectToRoute('driver_list'); 
      }catch (\Exception $e){ 
       throw $e; 
      } 
     } 
     throw new InvalidArgumentException('Invalid form data'); 
    } 
//... 
} 

/src/AppBundle/Form/DriverFormType.php

namespace AppBundle\Form; 

use AppBundle\Model\Driversdb\PublicSchema\Driver; 
use AppBundle\Service\DriverToJson; 
use PommProject\Foundation\Converter\ConverterPooler; 
use PommProject\PommBundle\Request\ParamConverter\EntityParamConverter; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class DriverFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options){ 
     $builder 
      ->add('testinfo', 'extrainfo', array('mapped'=>false)) 
      ->add('account_id', TextType::class) 
      ->add('ssn', TextType::class,array(
       'attr' => [ 
        'class' => 'col-xs-12' 
       ] 
      )) 
      // ... many other fields. 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults([ 
      'data_class'=> Driver::class, 
      'attr'=>array('novalidate'=>'novalidate'), 
     ]); 
    } 
} 
+0

有配置您的會話生成器在應用程序配置? https://github.com/pomm-project/pomm-bundle/blob/master/tests/app/config/config.yml#L38 – Sanpi

+0

是的,我已經設置在config.yml會議建設者。 –

+0

您的'infodata'字段的表定義是鍵入'jsonb'而不是'extrainfo'。這可能是轉換器從未被觸發的原因。 – greg

回答

1

POMM的轉換器使用的字段類型來確定至極轉換器應該調用。你的領域應該是extrainfo

創建這個新類型:

CREATE DOMAIN extrainfo AS jsonb; 

,並使用它的infodata列:

ALTER TABLE driver ALTER COLUMN infodata TYPE extrainfo; 
+0

也許'CREATE DOMAIN'而不是'CREATE TYPE'? – greg

+0

@greg更新:) – Sanpi