Slim3 (PHP) + Twig2 にて Markdown 記法を使えるようにする

PHP の View テンプレートである Twig は使いやすいが、
Slim + Twig で細かいことをしようとすると少し面倒。

下記、 API から受け取った Markdown 記法の文字データを簡単に扱いたいなどのためのサンプルコード。

Twig のドキュメント通りの方法

twigphp/markdown-extension をインストールする

$ cd /path/to/your/project
# bin/ に composer があること前提
$ bin/composer require twig/markdown-extension

src/dependencies.php

use Twig\Markdown\DefaultMarkdown;
use Twig\Markdown\MarkdownExtension;
use Twig\Markdown\MarkdownRuntime;
use Twig\RuntimeLoader\RuntimeLoaderInterface;

$container = $app->getContainer();

$container['view'] = function ($c) {
	$settings = $c->get('settings')['renderer'];
	$view = new \Slim\Views\Twig($settings['template_path'], []);

	$basePath = rtrim(str_ireplace('index.php', '', $c['request']->getUri()->getBasePath()), '/');
	$view->addExtension(new \Slim\Views\TwigExtension($c['router'], $basePath));

	// Markdown を使えるようにする
	// https://github.com/twigphp/markdown-extension
	$view->addExtension(new MarkdownExtension());
	$view->getEnvironment()->addRuntimeLoader(new class implements RuntimeLoaderInterface {
		public function load($class) {
			if (MarkdownRuntime::class === $class) {
				return new MarkdownRuntime(new DefaultMarkdown());
			}
		}
	});

	return $view;
};

index.phtml

<!-- 使い方1 -->
{{ post.body|markdown }}

<!-- 使い方2 -->
{% filter markdown %}
# Title

Hello!
{% endfilter %}

<!-- 使い方3 -->
{{ "# success"|markdown }}

エラーが出る

An exception has been thrown during the rendering of a template ("You cannot use the "markdown" filter as no Markdown library is available; try running "composer require erusev/parsedown".").

Markdown ライブラリーが入ってないので使えません。とのこと
"composer require erusev/parsedown" を試してください。とのこと

erusev/parsedown をインストールする

$ cd /path/to/your/project
$ bin/composer require erusev/parsedown

Github から他の Markdown パーサーをインストールして使う方法

PHP の Markdown パーサーは色々あるので、
好きなものを使いたい時のサンプルコード。

cebe/markdown しか試していない。

cebe/markdown をインストールする

$ cd /path/to/your/project
$ bin/composer require cebe/markdown "~1.2.0"

src/dependencies.php

  • markdown の細かい設定もできる
use cebe\markdown\GithubMarkdown;

$container = $app->getContainer();

$container['view'] = function ($c) {
	$settings = $c->get('settings')['renderer'];
	$view = new \Slim\Views\Twig($settings['template_path'], []);

	$basePath = rtrim(str_ireplace('index.php', '', $c['request']->getUri()->getBasePath()), '/');
	$view->addExtension(new \Slim\Views\TwigExtension($c['router'], $basePath));

	// Markdown を使えるようにする
	// return ではなく echo しているところに注意
	$view->getEnvironment()->addFilter(new Twig_SimpleFilter('markdown', function ($string) {
		// use github markdown
		$parser = new GithubMarkdown();
		$parser->enableNewlines = true;
		echo $parser->parse($string);
		// return $parser->parse($string);
	}));

	return $view;
};

index.phtml

  • 使い方はさっきと同様
<!-- 使い方1 -->
{{ post.body|markdown }}

<!-- 使い方2 -->
{% filter markdown %}
# Title

Hello!
{% endfilter %}

<!-- 使い方3 -->
{{ "# success"|markdown }}