<rss version="2.0" xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Михаил Юдин</title><link>https://mikhail-yudin.ru/blog/backend/</link><description/><generator>Hugo -- gohugo.io</generator><language>ru</language><lastBuildDate>Mon, 04 May 2020 00:00:00 +0000</lastBuildDate><image><url>https://mikhail-yudin.ru/images/brand/favicon.png</url><title>Михаил Юдин</title><link>https://mikhail-yudin.ru/</link></image><atom:link href="https://mikhail-yudin.ru/blog/backend/index.xml" rel="self" type="application/rss+xml"/><item turbo="true"><title>Lumen middleware для UNESCAPED_UNICODE и PRETTY_PRINT</title><link>https://mikhail-yudin.ru/blog/backend/json-unescaped-unicode-i-pretty-print-lumen-middleware/</link><pubDate>Mon, 04 May 2020 00:00:00 +0000</pubDate><guid>https://mikhail-yudin.ru/blog/backend/json-unescaped-unicode-i-pretty-print-lumen-middleware/</guid><description>Долго искал правильный способ возвращать PRETTY_PRINT и UNESCAPED_UNICODE в ответе от API в фреймворке Lumen.
Хотелка В современных реалиях нет нужды экранировать unicode в ответе от JSON API. Ещё хотелось красивый вывод для отладки. Лазил по интернетам, так и не нашёл решение, наверное не там искал. В голову пришло заюзать middleware для трансформации ответа.
Реализация Решение было простым: берём response - ответ и добавляем к нему нужные опции при помощи setEncodingOptions как к json_encode.</description><turbo:content><![CDATA[
      		<header>
      			<h1>Lumen middleware для UNESCAPED_UNICODE и PRETTY_PRINT</h1></header>
            <div class='entry-content'>
              <p>Долго искал правильный способ возвращать <code>PRETTY_PRINT</code> и <code>UNESCAPED_UNICODE</code> в ответе от API в фреймворке Lumen.</p>
<h2 id="хотелка">Хотелка</h2>
<p>В современных реалиях нет нужды экранировать unicode в ответе от JSON API. Ещё хотелось красивый вывод для отладки.
Лазил по интернетам, так и не нашёл решение, наверное не там искал. В голову пришло заюзать middleware для трансформации ответа.</p>
<h2 id="реализация">Реализация</h2>
<p>Решение было простым: берём response - ответ и добавляем к нему нужные опции при помощи <code>setEncodingOptions</code> как к <code>json_encode</code>.
В моей реализации я добавил <code>JSON_PRETTY_PRINT</code>, <code>JSON_UNESCAPED_UNICODE</code>, <code>JSON_UNESCAPED_SLASHES</code>. Последнее может лишнее, но хотелось красивого ответа при отладке.</p>
<p>Вариант &ldquo;в лоб&rdquo; выглядит так:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-php" data-lang="php"><span style="color:#ff79c6">&lt;?php</span>

<span style="color:#ff79c6">namespace</span> App\Http\Middleware;

<span style="color:#ff79c6">use</span> Closure;

<span style="color:#ff79c6">class</span> <span style="color:#50fa7b">UnescapedJsonMiddleware</span>
{
    <span style="color:#ff79c6">public</span> <span style="color:#ff79c6">function</span> <span style="color:#50fa7b">handle</span>(<span style="color:#8be9fd;font-style:italic">$request</span>, Closure <span style="color:#8be9fd;font-style:italic">$next</span>)
    {
        <span style="color:#8be9fd;font-style:italic">$data</span> <span style="color:#ff79c6">=</span> <span style="color:#8be9fd;font-style:italic">$next</span>(<span style="color:#8be9fd;font-style:italic">$request</span>);
        <span style="color:#8be9fd;font-style:italic">$data</span><span style="color:#ff79c6">-&gt;</span><span style="color:#50fa7b">setEncodingOptions</span>(JSON_PRETTY_PRINT <span style="color:#ff79c6">|</span> JSON_UNESCAPED_UNICODE <span style="color:#ff79c6">|</span> JSON_UNESCAPED_SLASHES);
        <span style="color:#ff79c6">return</span> <span style="color:#8be9fd;font-style:italic">$data</span>;
    }
}
</code></pre></div><p>Его можно доработать для обработки только JSON ответов, но мне этого было достаточно.</p>
<p>Актуальная версия лежит тут: <a href="https://gist.github.com/fagci/f4df62f39b912f819a0e7205541f551e" target=_blank rel="noopener noreferrer">Laravel / Lumen json options for response using middleware</a>.</p>

            </div>
      	]]></turbo:content></item></channel></rss>