ExtensionGuesser.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\HttpFoundation\File\MimeType;
  11. /**
  12. * A singleton mime type to file extension guesser.
  13. *
  14. * A default guesser is provided.
  15. * You can register custom guessers by calling the register()
  16. * method on the singleton instance.
  17. *
  18. * <code>
  19. * $guesser = ExtensionGuesser::getInstance();
  20. * $guesser->register(new MyCustomExtensionGuesser());
  21. * </code>
  22. *
  23. * The last registered guesser is preferred over previously registered ones.
  24. *
  25. */
  26. class ExtensionGuesser implements ExtensionGuesserInterface
  27. {
  28. /**
  29. * The singleton instance
  30. * @var ExtensionGuesser
  31. */
  32. static private $instance = null;
  33. /**
  34. * All registered ExtensionGuesserInterface instances
  35. * @var array
  36. */
  37. protected $guessers = array();
  38. /**
  39. * Returns the singleton instance
  40. *
  41. * @return ExtensionGuesser
  42. */
  43. static public function getInstance()
  44. {
  45. if (null === self::$instance) {
  46. self::$instance = new self();
  47. }
  48. return self::$instance;
  49. }
  50. /**
  51. * Registers all natively provided extension guessers
  52. */
  53. private function __construct()
  54. {
  55. $this->register(new MimeTypeExtensionGuesser());
  56. }
  57. /**
  58. * Registers a new extension guesser
  59. *
  60. * When guessing, this guesser is preferred over previously registered ones.
  61. *
  62. * @param ExtensionGuesserInterface $guesser
  63. */
  64. public function register(ExtensionGuesserInterface $guesser)
  65. {
  66. array_unshift($this->guessers, $guesser);
  67. }
  68. /**
  69. * Tries to guess the extension
  70. *
  71. * The mime type is passed to each registered mime type guesser in reverse order
  72. * of their registration (last registered is queried first). Once a guesser
  73. * returns a value that is not NULL, this method terminates and returns the
  74. * value.
  75. *
  76. * @param string $mimeType The mime type
  77. * @return string The guessed extension or NULL, if none could be guessed
  78. */
  79. public function guess($mimeType)
  80. {
  81. foreach ($this->guessers as $guesser) {
  82. $extension = $guesser->guess($mimeType);
  83. if (null !== $extension) {
  84. break;
  85. }
  86. }
  87. return $extension;
  88. }
  89. }