/**
  * @param Container $app
  */
 public function register(Container $app)
 {
     if (!isset($app['form.factory'])) {
         throw new \LogicException('You must register the FormServiceProvider to use the FormFilterServiceProvider.');
     }
     $app['lexik_form_filter.query_builder_updater'] = function () use($app) {
         return new FilterBuilderUpdater($app['lexik_form_filter.form_data_extractor'], $app['dispatcher']);
     };
     // Alias
     $app['form_filter'] = function () use($app) {
         return $app['lexik_form_filter.query_builder_updater'];
     };
     // Filter Types
     $app['form.types'] = $app->extend('form.types', function ($types) use($app) {
         $types = array_merge($types, [new Type\TextFilterType(), new Type\NumberFilterType(), new Type\NumberRangeFilterType(), new Type\CheckboxFilterType(), new Type\BooleanFilterType(), new Type\ChoiceFilterType(), new Type\DateFilterType(), new Type\DateRangeFilterType(), new Type\DateTimeFilterType(), new Type\DateTimeRangeFilterType(), new Type\CollectionAdapterFilterType(), new Type\SharedableFilterType()]);
         if (isset($app['doctrine'])) {
             $types[] = new Type\EntityFilterType($app['doctrine']);
         }
         return $types;
     });
     // Type extension
     $app['form.type.extensions'] = $app->extend('form.type.extensions', function ($extensions) {
         $extensions[] = new FilterTypeExtension();
         return $extensions;
     });
     // Form data extraction
     $app['lexik_form_filter.form_data_extractor'] = function () {
         $extractor = new FormDataExtractor();
         $extractor->addMethod(new DefaultExtractionMethod());
         $extractor->addMethod(new TextExtractionMethod());
         $extractor->addMethod(new ValueKeysExtractionMethod());
         return $extractor;
     };
     $app['lexik_form_filter.filter_prepare'] = function () {
         return new PrepareListener();
     };
     // Subscriber to get filter condition
     $app['lexik_form_filter.get_filter.doctrine_orm'] = function () {
         return new DoctrineORMSubscriber();
     };
     $app['lexik_form_filter.get_filter.doctrine_dbal'] = function () {
         return new DoctrineDBALSubscriber();
     };
     // Listener to apply filter conditions
     $app['lexik_form_filter.apply_filter.doctrine_orm'] = function () {
         return new DoctrineApplyFilterListener(null);
     };
     $app['lexik_form_filter.apply_filter.doctrine_dbal'] = function () {
         return new DoctrineApplyFilterListener(null);
     };
 }
 public function register(Application $app)
 {
     $app['lexik_form_filter.query_builder_updater'] = $app->share(function ($app) {
         $frmDataExt = $app['lexik_form_filter.form_data_extractor'];
         $dispatcher = $app['dispatcher'];
         return new FilterBuilderUpdater($frmDataExt, $dispatcher);
     });
     $app['lexik_form_filter.form_data_extractor'] = $app->share(function ($app) {
         $formDataExtractor = new FormDataExtractor();
         $formDataExtractor->addMethod(new DefaultExtractionMethod());
         $formDataExtractor->addMethod(new TextExtractionMethod());
         $formDataExtractor->addMethod(new ValueKeysExtractionMethod());
         if ($app->offsetExists('form-filter.data_extraction_methods')) {
             foreach ($app['form-filter.data_extraction_methods'] as $extMethod) {
                 $formDataExtractor->addMethod($extMethod);
             }
         }
         return $formDataExtractor;
     });
     $app['form.extensions'] = $app->share($app->extend('form.extensions', function ($extensions) use($app) {
         $extensions[] = new FilterExtension();
         return $extensions;
     }));
     $app['dispatcher']->addListener(FilterEvents::PREPARE, array(new PrepareListener(), 'onFilterBuilderPrepare'));
     $app['dispatcher']->addSubscriber(new DoctrineSubscriber());
 }