Error implement a "Doctrine Filter System"

Hello,
I’m trying to implement a “Doctrine Filter System” as documentation (http://flowframework.readthedocs.org/en/latest/TheDefinitiveGuide/PartIII/Persistence.html#on-the-doctrine-filter-system)
I created the class and I put the setting in the file “Configuration”.

 doctrine:
        filters:
          'SoftDeleteFilter': 'Xxxx\Intranet\Flow\Persistence\Doctrine\SoftDeleteFilter'

The class extends SQLFilter as a Doctrine doc (http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/filters.html)
I’m using TYPO3 Flow 2.3

This is my class:

namespace Xxxx\Intranet\Flow\Persistence\Doctrine;
use Doctrine\ORM\Mapping\ClassMetaData,
    Doctrine\ORM\Query\Filter\SQLFilter;


class SoftDeleteFilter extends SQLFilter
{

    /**
     * @param ClassMetaData $targetEntity
     * @param string $targetTableAlias
     * @return string
     */
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
    {
       return $targetTableAlias.'.deleted = 1';
    }
}

But when I delete the cache and recreate it gives me this error:

PHP Fatal error:  Cannot override final method Doctrine\ORM\Query\Filter\SQLFilter::__construct() in /var/www/public/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/Xxxx_Intranet_Flow_Persistence_Doctrine_SoftDeleteFilter.php on line 52
PHP Stack trace:
PHP   1. {main}() /var/www/public/flow:0
PHP   2. require() /var/www/public/flow:18
PHP   3. TYPO3\Flow\Core\Bootstrap->run() /var/www/public/Packages/Framework/TYPO3.Flow/Scripts/flow.php:55
PHP   4. TYPO3\Flow\Cli\CommandRequestHandler->handleRequest() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Bootstrap.php:108
PHP   5. TYPO3\Flow\Cli\CommandRequestHandler->boot() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Cli/CommandRequestHandler.php:89
PHP   6. TYPO3\Flow\Core\Booting\Sequence->invoke() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Cli/CommandRequestHandler.php:153
PHP   7. TYPO3\Flow\Core\Booting\Sequence->invokeStep() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Sequence.php:85
PHP   8. TYPO3\Flow\Core\Booting\Sequence->invokeStep() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Sequence.php:105
PHP   9. TYPO3\Flow\Core\Booting\Sequence->invokeStep() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Sequence.php:105
PHP  10. TYPO3\Flow\Core\Booting\Sequence->invokeStep() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Sequence.php:105
PHP  11. TYPO3\Flow\Core\Booting\Sequence->invokeStep() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Sequence.php:105
PHP  12. TYPO3\Flow\Core\Booting\Sequence->invokeStep() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Sequence.php:105
PHP  13. TYPO3\Flow\Core\Booting\Sequence->invokeStep() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Sequence.php:105
PHP  14. TYPO3\Flow\Core\Booting\Sequence->invokeStep() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Sequence.php:105
PHP  15. TYPO3\Flow\Core\Booting\Step->__invoke() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Sequence.php:101
PHP  16. call_user_func:{/var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Step.php:49}() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Step.php:49
PHP  17. TYPO3\Flow\Core\Booting\Scripts::initializePersistence() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Step.php:49
PHP  18. TYPO3\Flow\Persistence\Doctrine\PersistenceManager_Original->initialize() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/Booting/Scripts.php:479
PHP  19. TYPO3\Flow\Object\DependencyInjection\DependencyProxy->getEventManager() /var/www/public/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/TYPO3_Flow_Persistence_Doctrine_PersistenceManager.php:56
PHP  20. TYPO3\Flow\Object\DependencyInjection\DependencyProxy->__call() /var/www/public/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/TYPO3_Flow_Persistence_Doctrine_PersistenceManager.php:56
PHP  21. TYPO3\Flow\Object\DependencyInjection\DependencyProxy->_activateDependency() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Object/DependencyInjection/DependencyProxy.php:94
PHP  22. Closure->__invoke() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Object/DependencyInjection/DependencyProxy.php:57
PHP  23. TYPO3\Flow\Persistence\Doctrine\PersistenceManager->TYPO3\Flow\Persistence\Doctrine\{closure}() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Object/DependencyInjection/DependencyProxy.php:57
PHP  24. TYPO3\Flow\Object\ObjectManager->get() /var/www/public/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/TYPO3_Flow_Persistence_Doctrine_PersistenceManager.php:700
PHP  25. TYPO3\Flow\Object\ObjectManager->buildObjectByFactory() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Object/ObjectManager.php:169
PHP  26. TYPO3\Flow\Persistence\Doctrine\EntityManagerFactory_Original->create() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Object/ObjectManager.php:454
PHP  27. Doctrine\ORM\Query\FilterCollection->enable() /var/www/public/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/TYPO3_Flow_Persistence_Doctrine_EntityManagerFactory.php:106
PHP  28. spl_autoload_call() /var/www/public/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/TYPO3_Flow_Persistence_Doctrine_EntityManagerFactory.php:111
PHP  29. TYPO3\Flow\Core\ClassLoader->loadClass() /var/www/public/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/TYPO3_Flow_Persistence_Doctrine_EntityManagerFactory.php:111
PHP  30. TYPO3\Flow\Cache\Frontend\PhpFrontend->requireOnce() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Core/ClassLoader.php:149
PHP  31. TYPO3\Flow\Cache\Backend\SimpleFileBackend->requireOnce() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Cache/Frontend/PhpFrontend.php:106
PHP  32. include_once() /var/www/public/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Cache/Backend/SimpleFileBackend.php:298

Thank you.
Stefano.

Hey

There’s an example of a working one in Flow 3.0 (https://github.com/neos/flow-development-collection/blob/master/TYPO3.Flow/Classes/TYPO3/Flow/Security/Authorization/Privilege/Entity/Doctrine/SqlFilter.php)

I think the solution is to add @Flow\Proxy(false) to your class to prevent Flows proxy building, which seems to make it fail.

Cheers,
Aske

Thanks Aske,
I put the annotation @Proxy(false) in class as in the example and is work!.

/**
 * Class SoftDeleteFilter
 * @package Xxxx\Intranet\Flow\Persistence\Doctrine
 * @Flow\Proxy(false)
 */
class SoftDeleteFilter extends SQLFilter
{

    /**
     * @param ClassMetaData $targetEntity
     * @param string $targetTableAlias
     * @return string
     */
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
    {
        //throw new Exception();

        return  $targetTableAlias.'.deleted = true';
    }
}

Thank you.
Stefano.

I created a PR to explain this in the documentation: https://github.com/neos/flow-development-collection/pull/116