WŁASNY ASSETIC FILTER W SYMFONY3 Z UŻYCIEM DOCTRINE

W moim aktualnym projekcie musiałem pozmieniać prefixy w stylach css, bez użycia LESS i SASS (specyfika projektu). Jako że wykorzystujemy AsseticBundle do zarządzania zasobami, najprostszym rozwiązaniem okazało się stworzenie własnego filtra który z pomocą Doctrine połączy się z baza, pobierze wspomniany prefix oraz uruchomi funkcję str_replace.

20-06-2017

Całość zaczynamy od rejestracji filtra jako serwisu z przekazaniem w argumencie EntityManagera i oznaczenia go tagiem jako AsseticFilter:


    changer:
        class: Bagsiur\WebsiteBundle\Assetic\Changer
        arguments: ["@doctrine.orm.entity_manager"]
        tags:
            - { name: assetic.filter, alias: changer }
			

Następny krok to stworzenie klasy juz zarejestrowanego serwisu (w moim przypadku jest to: Bagsiur\WebsiteBundle\Assetic\Changer.php). Aby stworzyć nowy filter dla AsseticBundle wystarczy zaimplementować interfejs FilterInterface. Aby uniknąć problemów z serjalizacją w PDO dodajemy magiczną funkcję __sleep zwracającą pustą tablicę:


    namespace Bagsiur\WebsiteBundle\Assetic;

    use Assetic\Asset\AssetInterface;  
    use Assetic\Filter\FilterInterface;
    use Doctrine\ORM\EntityManager;

    class Changer implements FilterInterface  
    {

        protected $em;

        public function __sleep()
        {
            return array();
        }   

        public function __construct(EntityManager $entityManager)
        {
            $this->em = $entityManager;
        }

        public function filterLoad(AssetInterface $asset)
        {
        }

        public function filterDump(AssetInterface $asset)
        {

            $settings = $this->em->getRepository('BagsiurAdminBundle:Settings')->find(1);
            $content = str_replace('b285b110c52093a4110368f066b14cf3', $settings->getPrefix(), $asset->getContent());

            $asset->setContent($content);
        }

    }
	

Funkcja filterDump wykona porządaną przez nas operację. W tym przypadku pobierze prefix z bazy i zastąpi nim hash md5 - tak to zaprojektowaliśmy. Oczywiście całość wykona się tylko raz więc w przypadku zmiany prefixu, niezbędne będzie wyczyszczenie cachu oraz instalacja assetów na nowo. U nas jednak wykonuje to już inny serwis.

Aby wykorzystać nasz filtr wystarczy dopisać go podczas deklaracji assetów np:


    {% block pageCSS %}
        {{ parent() }}
        {% stylesheets 
            'bundles/bagsiurwebsite/css/style.css'
            filter='cssrewrite, scssphp, changer'
            output='bundles/bagsiurwebsite/compiled/template.css' 
        %}
            
        {% endstylesheets %} 
    {% endblock %}
	

Oczywiście nasz filtr oznaczyliśmy wcześniej aliasem "changer". Mam nadzieję że ten krótki wpis okaże się pomocny przy tworzeniu filtrów z dostępem do bazy danych.


  wstecz