[Laravel]你們最愛的 Markdown 不就來了嗎

Kunyu
Mar 1, 2024
Photo by Markus Spiske on Unsplash

想必很多人對於 Markdown 並不陌生,它是一種輕量級的標記語言,常被用於寫作文章,語法簡單直觀,使用者可以專注於創作內容,而不必擔心排版問題,Markdown 與 HTML 也有著對應關係,因此本篇要來講述 Laravel 所提供的功能,讓我們可以輕鬆將 Markdown 所撰寫的內容,呈現在網頁。

要能夠在 Laravel 服務中呈現 Markdown 所輸入內容,必須在 Controllers 跟 Views 都必須做一些事情,首先 Controllers 接收使用者所送過來的請求時,使用 Str::markdown 轉換成 HTML 標籤。

<?php
namespace App\Http\Controllers;

// 必須 use Str
use Illuminate\Support\Str;
use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
public function viewSinglePost(Post $post)
{
// 在 Laravel,只需要一行就可以輕鬆轉換成 HTML 標籤。
$post['body'] = Str::markdown($post->body);
return view('single-post', ['post' => $post]);
}
}

Laravel Blade 變數使用語法預設會防範 XSS 攻擊,因此會將 HMTL 語法進行轉譯 ,但這個保護機制會導致無法呈現使用者所輸入的 Markdown,所以我們要使用"不保護"的語法,如下所示,透過 {!! 變數 !!} 語法,如果是 Markdown 所對應的 HMTL 將會被直接呈現,大功告成。

<div class="body-content">
{!! $post->body !!}
</div>

控制可呈現的 Element

假設你基於某些理由,希望只有某些 Markdown 語法能被轉換,那麼可以使用 strip_tags 來限定,最後 Laravel 的 Str::markdown 也足夠聰明,如果你嘗試用 XSS 語法,雖然變數使用 {!! !!} 語法沒有保護,但是還是會在 Str::markdown 進行處理。

<?php
namespace App\Http\Controllers;

// 必須 use Str
use Illuminate\Support\Str;
use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
public function viewSinglePost(Post $post)
{
// 限定只有<p><ul><ol><li><br>能夠呈現。
$post['body'] = strip_tags(Str::markdown($post->body), '<p><ul><ol><li><br>');
return view('single-post', ['post' => $post]);
}
}

--

--