要能夠在 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]);
}
}