Installation Add the package via Composer in your Laravel project:
composer require hyperf/laminas-mime
(Note: Since this is a mirror of laminas/laminas-mime, ensure compatibility with Laravel’s PHP version.)
First Use Case: Detecting MIME Types
Use the Laminas\Mime\MimeType class to detect MIME types from file extensions or content:
use Laminas\Mime\MimeType;
$mimeType = new MimeType();
$type = $mimeType->typeOf('path/to/file.pdf'); // Returns 'application/pdf'
Where to Look First
vendor/laminas-mime/src/ for core classes like MimeType, MimeTypeGuesser, and Message.MIME Type Detection
$mime = new MimeType();
$type = $mime->typeOf('document.txt'); // 'text/plain'
$guesser = new Laminas\Mime\MimeTypeGuesser();
$type = $guesser->guess($fileContent); // Sniffs from binary data
Email/Message Handling
Use Laminas\Mime\Message to parse or construct MIME messages (e.g., emails):
use Laminas\Mime\Message;
$message = Message::fromString($rawEmail);
$headers = $message->getHeaders(); // Parse headers, attachments, etc.
Laravel Service Provider Binding Bind the package to Laravel’s container for dependency injection:
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(Laminas\Mime\MimeType::class, function ($app) {
return new Laminas\Mime\MimeType();
});
}
Then inject via constructor:
public function __construct(private Laminas\Mime\MimeType $mimeType) {}
File Uploads
Validate uploads by MIME type in Laravel’s HandleIncomingRequest trait:
public function handle(Request $request)
{
$file = $request->file('document');
$mime = app(Laminas\Mime\MimeType::class);
if ($mime->typeOf($file->getPathname()) !== 'application/pdf') {
throw new \Exception('Invalid file type');
}
}
Custom MIME Types Extend the default MIME database (see Gotchas and Tips).
PHP Version Compatibility
hyperf/laminas-mime specifically, as forks may lag behind upstream.Content Sniffing Limitations
$extensionType = $mime->typeOf('file.jpg');
$sniffedType = $guesser->guess(file_get_contents('file.jpg'));
if ($extensionType !== $sniffedType) {
// Handle mismatch (e.g., block upload)
}
Memory Usage
$guesser->guess(fopen('large_file.mp4', 'r'));
Caching MIME Types
MimeType caches results by default. Clear cache if extensions change:
$mime = new MimeType();
$mime->resetCache(); // Clears cached types
typeOf() receives absolute paths or correct relative paths.MimeTypeGuesser may throw RuntimeException for unsupported types.Custom MIME Database
Override the default MIME types by extending Laminas\Mime\MimeType:
use Laminas\Mime\MimeType;
class CustomMimeType extends MimeType
{
public function __construct()
{
$this->addType('application/x-custom', 'custom');
}
}
Bind it in Laravel’s container:
$this->app->singleton(Laminas\Mime\MimeType::class, function ($app) {
return new CustomMimeType();
});
Add Custom Sniffers
Implement Laminas\Mime\MimeTypeGuesserInterface for custom content sniffing logic:
class CustomGuesser implements MimeTypeGuesserInterface
{
public function guess($content): string
{
if (strpos($content, 'CUSTOM_MAGIC') === 0) {
return 'application/x-custom';
}
return 'text/plain';
}
}
Register it with the guesser:
$guesser = new Laminas\Mime\MimeTypeGuesser();
$guesser->addGuesser(new CustomGuesser());
Laravel Filesystem Integration
Use the package with Laravel’s Storage facade for cloud files:
use Illuminate\Support\Facades\Storage;
$path = Storage::path('file.pdf');
$type = app(Laminas\Mime\MimeType::class)->typeOf($path);
getMimeTypes() method in a custom MimeType class.How can I help you explore Laravel packages today?