Symfony:我在哪里放置代码来注册自定义MimeTypeGuesser?

时间:2015-07-13 18:02:54

标签: symfony

我需要注册一个自定义的MimeTypeGuesser,这样我就可以添加一些逻辑来处理.docx文件,我的Web服务器安装的PHP将其视为application/zip(这在技术上是正确的)。我希望它被识别为application/mswordapplication/vnd.openxmlformats-officedocument.wordprocessingml.document

在课程Symfony\Component\HttpFoundation\File\MimeType的申诉评论中,有一些关于如何注册自定义猜测者的信息:

 * You can register custom guessers by calling the register() method on the
 * singleton instance. Custom guessers are always called before any default ones.
 *
 *     $guesser = MimeTypeGuesser::getInstance();
 *     $guesser->register(new MyCustomMimeTypeGuesser());

很好,但这个注册码的适当位置在哪里?

我希望这是一个应用程序范围内的变化,但我想不出一个好的地方来实现它。

2 个答案:

答案 0 :(得分:2)

老实说,我自己无法确定哪个地方适合注册定制猜测,所以我只建议你一个。

由于您的目标是针对应用范围的解决方案,因此我认为覆盖build类的Bundle方法可以解决这个问题。

我们假设您的包名为AppBundle,然后您的Bundle配置文件应位于AppBundle.php

src/AppBundle/AppBundle.php

通常该文件应该是空的,但是一个扩展Symfony的核心Bundle类的空类 - Symfony\Component\HttpKernel\Bundle\Bundle

从那里你可以覆盖我们从build继承的Bundle\Bundle方法并注册你的猜测器。通常build()用于注册自定义扩展,例如支付网关,或编译器传递以及类似的东西。你可以在评论中看到它实际上:

/**
 * Builds the bundle.
 *
 * It is only ever called once when the cache is empty.
 *
 * This method can be overridden to register compilation passes,
 * other extensions, ...
 *
 * @param ContainerBuilder $container A ContainerBuilder instance
 */
public function build(ContainerBuilder $container)
{

}

因此,在课程顶部添加以下语句:

use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
use Symfony\Component\DependencyInjection\ContainerBuilder;

然后简单地覆盖方法:

public function build(ContainerBuilder $container) {
    parent::build($container);

    $guesser = MimeTypeGuesser::getInstance();
    $guesser->register( new MyMimeTypeGuesser() );
}

一旦应用程序加载了所有捆绑包,这将加载您的自定义猜测器。我想说这可能不是一个完美的解决方案,但暂时它可以帮助你。

答案 1 :(得分:0)

您可以在Bundle::boot

中执行此操作
use AppBundle\HttpFoundation\File\MimeType\MyCustomMimeTypeGuesser;
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class AppBundle extends Bundle
{
    /**
     * {@inheritdoc}
     */
    public function boot()
    {
        parent::boot();

        MimeTypeGuesser::getInstance()->register(new MyCustomMimeTypeGuesser());
    }

    ...

}

每次Kernel启动时都会调用此方法。

如果你在Bundle::build中这样做,它就行不通,因为调用需要在运行时进行。