我需要注册一个自定义的MimeTypeGuesser,这样我就可以添加一些逻辑来处理.docx文件,我的Web服务器安装的PHP将其视为application/zip
(这在技术上是正确的)。我希望它被识别为application/msword
或application/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());
很好,但这个注册码的适当位置在哪里?
我希望这是一个应用程序范围内的变化,但我想不出一个好的地方来实现它。
答案 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
中这样做,它就行不通,因为调用需要在运行时进行。