Installation:
composer require derafu/markdown
Add the service provider to config/app.php:
'providers' => [
// ...
Derafu\Markdown\MarkdownServiceProvider::class,
],
First Use Case: Render a simple Markdown string:
use Derafu\Markdown\Facades\Markdown;
$html = Markdown::render('# Hello, Markdown!');
echo $html; // Outputs: <h1>Hello, Markdown!</h1>
Configuration: Publish the config file:
php artisan vendor:publish --provider="Derafu\Markdown\MarkdownServiceProvider"
Edit config/markdown.php to customize extensions, syntax highlighting, or default options.
Basic Rendering:
$markdown = Markdown::render($rawMarkdown);
Reusable Components: Create a helper class for consistent rendering:
class MarkdownRenderer {
public static function renderWithDefaults(string $content): string {
return Markdown::render($content, [
'extensions' => ['tables', 'fenced_code'],
'html' => true,
]);
}
}
Integration with Blade:
// In a controller
return view('post.show', ['content' => Markdown::render($post->body)]);
// In Blade
{!! $content !!}
API Responses:
return response()->json([
'content' => Markdown::render($request->markdown),
]);
Dynamic Extensions: Load extensions conditionally:
$extensions = [];
if ($request->has('tables')) {
$extensions[] = 'tables';
}
Markdown::render($content, ['extensions' => $extensions]);
Caching Rendered Output:
$cacheKey = 'markdown_' . md5($content);
$html = Cache::remember($cacheKey, now()->addHours(1), function() use ($content) {
return Markdown::render($content);
});
Syntax Highlighting:
Integrate with vlucas/phpdotenv or spatie/ray for debugging:
$highlighted = Markdown::render($codeBlock, [
'highlight' => true,
'theme' => 'github-dark',
]);
Markdown in Forms:
Use for rich-text editors (e.g., with summernote or trix):
// Store raw Markdown
$post->body = $request->markdown;
// Display rendered HTML
echo Markdown::render($post->body);
XSS Vulnerabilities:
$safeHtml = Markdown::render($userInput, ['html' => false]);
Blade::escape() if rendering in Blade templates.Extension Conflicts:
smartypants) may break if misconfigured.Markdown::render($content, ['extensions' => ['smartypants']]) in isolation.Performance:
once():
$html = Cache::once($cacheKey, function() use ($content) {
return Markdown::render($content);
});
Deprecated Features:
config/markdown.php for deprecated options (e.g., safe_mode → html).Inspect Extensions: Dump loaded extensions:
dd(Markdown::getExtensions());
Log Rendering Errors: Wrap rendering in a try-catch:
try {
$html = Markdown::render($content);
} catch (\Exception $e) {
Log::error("Markdown render failed: " . $e->getMessage());
$html = "<p>Error rendering content.</p>";
}
Test Edge Cases:
Markdown::render('')Markdown::render('# Incomplete')Markdown::render('*<script>alert(1)</script>*')Custom Extensions: Register a custom extension:
Markdown::extend('custom', function($markdown) {
$markdown->addExtension(new \Derafu\Markdown\Extension\CustomExtension());
});
Pre/Post Processing:
Use Laravel’s app binding to modify output:
app()->afterResolving('markdown', function ($markdown) {
$markdown->addExtension(new \Your\Custom\Extension());
});
Override Defaults:
Extend the base config in AppServiceProvider:
public function boot() {
config(['markdown.defaults.extensions' => ['tables', 'fenced_code']]);
}
Use with Laravel Scout: Index rendered content for search:
$post->searchableContent = Markdown::render($post->body);
Markdown in Notifications:
use Derafu\Markdown\Facades\Markdown;
Notification::route('mail', $user->email)
->notify(new PostUpdated($post, Markdown::render($post->changes)));
CI/CD Integration: Test Markdown rendering in pipelines:
php artisan markdown:test resources/markdown/*.md
How can I help you explore Laravel packages today?