0

私は Symfony 2 を使用するプロジェクトで作業しています。Assetic をリライトと少ないフィルターで使用していますが、正常に動作します。現在、管理者 (接続ユーザー) がフォントやメインカラーなどの CSS のいくつかの機能を制御できるようにする予定です。 . 私が直面している問題は次のとおりです。

- これらの css の変更をエンティティから css 管理に統合するにはどうすればよいですか?

  • カスタムCSSを含めるためにasseticにルーティングルールを使用させることはできません
  • この作業に成功した場合でも、カスタム css に変更を加えるたびに、アセットを Web フォルダーにインストールしassetic:dumpを作成して、コントローラーからキャッシュをクリアする必要があります。
4

2 に答える 2

1

Steffen が提案したように、動的 CSS を Twig テンプレートに配置する必要があります。

しかし今では、css のその部分が、css (HTTP 302 など) ではなく symfony アプリケーションへの完全なリクエストになり、サーバーの負荷が増加することに苦しむかもしれません。

そのため、次の 3 つのことを行うことをお勧めします (日付ベースなど、対話なしで CSS が変更されない場合は、ステップ 2 をスキップできます)。

  • 現在の出力を web/additional.css などにキャッシュするサービスを実装します。
  • CSSを定期的に更新するRequestListenerを書いて登録する
  • サービス呼び出しで css に変更を加える可能性のあるすべてのコントローラー アクションを拡張します。

例 (Doctrine を使用し、いくつかの色情報を持つエンティティがあると仮定します):

サービス

<?php 
//Acme\DemoBundle\Service\CSSDeployer.php
namespace Acme\DemoBundle\Service;

use Doctrine\ORM\EntityManager;

class CSSDeployer
{
    /**
     * @var EntityManager
     */
    protected $em;

    /**
     * Twig Templating Service
     */
    protected $templating;

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

    public function deployStyle($filepath)
    {
        $entity = $this->em->getRepository('AcmeDemoBundle:Color')->findBy(/* your own logic here */);
        if(!$entity) {
            // your error handling
        }

        if(!file_exists($filepath)) {
            // your error handling, be aware of the case where this service is run the first time though
        }

        $content = $this->templating->render('AcmeDemoBundle:CSS:additional.css.twig', array(
            'data' => $entity
        ));

        //Maybe you need to wrap below in a try-catch block
        file_put_contents($filepath, $content);
    }
}

サービス登録

#Acme\DemoBundle\Resources\config\services.yml
services:
    #...
    css_deployer:
        class: Acme\DemoBundle\Service\CSSDeployer
        arguments: [ @doctrine.orm.entity_manager, @templating ]

リクエストリスナー

<?php
//Acme\DemoBundle\EventListener\RequestListener.php
namespace Acme\DemoBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Debug\Exception\ContextErrorException;
use \DateTime;
use Doctrine\ORM\EntityManager;

class RequestListener
{
    /**
     * @var ContainerInterface
     */
    protected $container;

    /**
     * @var EntityManager
     */
    protected $em;

    public function __construct(ContainerInterface $container, $em)
    {
        $this->container = $container;
        $this->em        = $em;
    }

    /**
     * Checks filemtime (File modification time) of web/additional.css
     * If it is not from today it will be redeployed.
     */
    public function onKernelRequest(GetResponseEvent $event)
    {
        $kernel     = $event->getKernel();
        $container  = $this->container;

        $path = $container->get('kernel')->getRootDir().'/../web'.'/additional.css';

        $time = 1300000000;

        try {
            $time = @filemtime($path);
        } catch(ContextErrorException $ex) {
            //Ignore
        } catch(\Exception $ex) {
            //will never get here
            if(in_array($container->getParameter("kernel.environment"), array("dev","test"))) {
                throw $ex;
            }
        }

        if($time === FALSE || $time == 1300000000) {
            file_put_contents($path, "/*Leer*/");
            $time = 1300000000;
        }

        $modified   = new \DateTime();
        $modified->setTimestamp($time);
        $today      = new \DateTime();

        if($modified->format("Y-m-d")!= $today->format("Y-m-d")) {
            //UPDATE CSS
            try {                    
                $container->get('css_deployer')->deployStyle($path);
            } catch(\Exception $ex) {
                if(in_array($container->getParameter("kernel.environment"), array("dev","test"))){
                    throw $ex;
                }
            }
        } else {
            //DO NOTHING
        }
    }
}

RequestListener 登録

#Acme\DemoBundle\Resources\config\services.yml
acme_style_update_listener.request:
    class: Acme\DemoBundle\EventListener\RequestListener
    arguments: [ @service_container, @doctrine.orm.entity_manager ]
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

コントローラーのアクション

public function updateAction()
{
    // Stuff
    $path = '....';
    $this->get('css_deployer')->deployStyle($path);
}

これが将来誰かに役立つことを願っています。

于 2014-09-09T11:52:59.050 に答える
1

あなた(または他の誰か)がまだこれを必要とする場合:

これを解決するには、すべての一般的な CSS をいつものように Assetic によって処理されるアセットに入れ、動的な CSS 生成を Controller アクションに入れ、CSS を Twig でレンダリングします。

于 2014-01-24T18:46:49.710 に答える