{"data":{"markdownRemark":{"frontmatter":{"title":"Как подружить monolog с redis в lumen","date":"15 June 2015","path":"/kak-podruzhit-monolog-s-redis-v-lumen/","author":null,"excerpt":"В том, что бы подружить monolog с redis в lumen (Производный движок Laravel) нет ничего сложного. В статье подробно расписан этот процесс","tags":["Laravel","Lumen","PHP","Redis"],"coverImage":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwAB/9oADAMBAAIQAxAAAAGGZUFjbL//xAAaEAEAAwADAAAAAAAAAAAAAAABAAIRAxIh/9oACAEBAAEFAq0yGsOOzKKPrK9mf//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABwQAAICAwEBAAAAAAAAAAAAAAARASESMnECQf/aAAgBAQAGPwLzGdzDQ6s1H94Y0uGx/8QAGhABAQEBAQEBAAAAAAAAAAAAAREAITFBkf/aAAgBAQABPyGsvGIuDQ94RlwXF+4IEj7Gvcwac6N8Rnm//9oADAMBAAIAAwAAABAP7//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCsf//EABURAQEAAAAAAAAAAAAAAAAAAAAh/9oACAECAQE/EFf/xAAcEAEBAAICAwAAAAAAAAAAAAABEQAhMUFhceH/2gAIAQEAAT8Qem6azOS3nFg9bFNdOsoHxRQO76wwcNbGFoMUBGeMKRNIPrP/2Q==","aspectRatio":1.5,"src":"/static/0ca8e82d44361ebfa605e9f5aac4c184/b4295/monolog-105-1.jpg","srcSet":"/static/0ca8e82d44361ebfa605e9f5aac4c184/127d5/monolog-105-1.jpg 200w,\n/static/0ca8e82d44361ebfa605e9f5aac4c184/7ef6a/monolog-105-1.jpg 400w,\n/static/0ca8e82d44361ebfa605e9f5aac4c184/b4295/monolog-105-1.jpg 800w,\n/static/0ca8e82d44361ebfa605e9f5aac4c184/9c40d/monolog-105-1.jpg 864w","sizes":"(max-width: 800px) 100vw, 800px"}}}},"id":"e2f4ee91-b4de-526e-9e7e-9b8202927627","html":"<p>В принципе ничего сложного нет. Данная мини статья рассчитана на начинающих в PHP. Суть статьи больше в том, что бы показать, как переопределять методы.</p>\n<p>Итак, понадобилось нам писать логи в redis, с чего начать? А начнём мы с того, что заглянем в папочку <strong>/vendor/laravel/lumen-framework/src/</strong> в файл <strong>Application.php</strong>.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token comment\">/**\n    * Register container bindings for the application.\n    *\n    * @return void\n    */</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">function</span> <span class=\"token function\">registerLogBindings</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">singleton</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'Psr\\Log\\LoggerInterface'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Logger</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'lumen'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token variable\">$this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">getMonologHandler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token comment\">/**\n    * Get the Monolog handler for the application.\n    *\n    * @return \\Monolog\\Handler\\AbstractHandler\n    */</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getMonologHandler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">StreamHandler</span><span class=\"token punctuation\">(</span><span class=\"token function\">storage_path</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'logs/lumen.log'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> Logger<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token constant\">DEBUG</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">setFormatter</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">LineFormatter</span><span class=\"token punctuation\">(</span><span class=\"token constant\">null</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">null</span><span class=\"token punctuation\">,</span> <span class=\"token boolean constant\">true</span><span class=\"token punctuation\">,</span> <span class=\"token boolean constant\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>В файле видим метод <strong>registerLogBindings</strong> который в свою очередь вызывает <strong>getMonologHandler</strong>, он то нам и нужен.</p>\n<p>Что ж, для начала наследуем класс  Application. Я обычно размещаю такие классы в директории <strong>/app/Classes/</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>\n    \n    <span class=\"token comment\">/**\n     * Файл Application.php\n     */</span>\n    \n    <span class=\"token keyword\">namespace</span> <span class=\"token package\">app<span class=\"token punctuation\">\\</span>Classes</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token comment\">// Наследовать будем конечно же от \\Laravel\\Lumen\\Application</span>\n    <span class=\"token keyword\">class</span> <span class=\"token class-name\">Application</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\"><span class=\"token punctuation\">\\</span>Laravel<span class=\"token punctuation\">\\</span>Lumen<span class=\"token punctuation\">\\</span>Application</span> <span class=\"token punctuation\">{</span>\n    \n        <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token punctuation\">}</span></span></code></pre></div>\n<p>Теперь переопределим метод <strong>getMonologHandler</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>\n    \n    <span class=\"token keyword\">namespace</span> <span class=\"token package\">app<span class=\"token punctuation\">\\</span>Classes</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token comment\">// Импортируем необходимые пространства имён</span>\n    <span class=\"token keyword\">use</span> <span class=\"token package\">Monolog<span class=\"token punctuation\">\\</span>Logger</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">use</span> <span class=\"token package\">Monolog<span class=\"token punctuation\">\\</span>Handler<span class=\"token punctuation\">\\</span>RedisHandler</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">use</span> <span class=\"token package\">Monolog<span class=\"token punctuation\">\\</span>Formatter<span class=\"token punctuation\">\\</span>JsonFormatter</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token comment\">// Наследовать будем конечно же от \\Laravel\\Lumen\\Application</span>\n    <span class=\"token keyword\">class</span> <span class=\"token class-name\">Application</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\"><span class=\"token punctuation\">\\</span>Laravel<span class=\"token punctuation\">\\</span>Lumen<span class=\"token punctuation\">\\</span>Application</span> <span class=\"token punctuation\">{</span>\n    \n        <span class=\"token comment\">/**\n         * Get the Monolog handler for the application.\n         *\n         * @return \\Monolog\\Handler\\AbstractHandler\n         */</span>\n        <span class=\"token keyword\">protected</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getMonologHandler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    \n            <span class=\"token comment\">// Создадим экземпляр класса Predis</span>\n            <span class=\"token variable\">$redis</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\"><span class=\"token punctuation\">\\</span>Predis<span class=\"token punctuation\">\\</span>Client</span><span class=\"token punctuation\">(</span><span class=\"token double-quoted-string string\">\"tcp://localhost:6379\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            \n            <span class=\"token comment\">// Добавим дефолтное имя ключа, по которому будут писаться наши логи</span>\n            <span class=\"token comment\">// Для удобства, дадим возможность изменять это значение в файле .env</span>\n            <span class=\"token variable\">$key</span> <span class=\"token operator\">=</span> <span class=\"token function\">env</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'MONOLOG_REDIS_KEY'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'logs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n            <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">RedisHandler</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$redis</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$key</span><span class=\"token punctuation\">,</span> Logger<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token constant\">DEBUG</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n        <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token punctuation\">}</span></span></code></pre></div>\n<p>Осталось только подменить наш класс в файле <strong>/bootstrap/app.php</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>\n    <span class=\"token comment\">/*\n    |--------------------------------------------------------------------------\n    | Create The Application\n    |--------------------------------------------------------------------------\n    |\n    | Here we will load the environment and create the application instance\n    | that serves as the central piece of this framework. We'll use this\n    | application as an \"IoC\" container and router for this \n    |\n    */</span>\n    \n    <span class=\"token comment\">// Закомментируем либо удалим</span>\n    <span class=\"token comment\">//$app = new Laravel\\Lumen\\Application(</span>\n    <span class=\"token comment\">//\trealpath(__DIR__.'/../')</span>\n    <span class=\"token comment\">//);</span>\n    \n    <span class=\"token variable\">$app</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">App<span class=\"token punctuation\">\\</span>Classes<span class=\"token punctuation\">\\</span>Application</span><span class=\"token punctuation\">(</span>\n    \t<span class=\"token function\">realpath</span><span class=\"token punctuation\">(</span><span class=\"token constant\">__DIR__</span><span class=\"token punctuation\">.</span><span class=\"token single-quoted-string string\">'/../'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span></code></pre></div>\n<p>Если оставить сейчас всё как есть, то в redis будут писаться строковые значения. Но нам не составит труда писать это к примеру в формате json.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">RedisHandler</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$redis</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$key</span><span class=\"token punctuation\">,</span> Logger<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token constant\">DEBUG</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">setFormatter</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">JsonFormatter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h4>Что почитать?</h4>\n<p><a href=\"http://php.net/manual/ru/language.oop5.basic.php\"> Классы и Объекты. Основы.</a></p>\n<p><a href=\"http://php.net/manual/ru/language.namespaces.importing.php\"> Пространства имён</a></p>\n<p>Так же смотрите и разбирайте исходники lumen</p>","excerpt":"В принципе ничего сложного нет. Данная мини статья рассчитана на начинающих в PHP. Суть статьи больше в том, что бы показать, как…"}},"pageContext":{"isCreatedByStatefulCreatePages":false,"type":"posts","next":{"frontmatter":{"path":"/tryuki-s-kollekciyami-v-laravel/","title":"Трюки с коллекциями в laravel","tags":["Laravel","Collections"]},"fileAbsolutePath":"/srv/www/softroot.ru/src/posts/2015-06-11-tryuki-s-kollekciyami-v-laravel.md"},"previous":{"frontmatter":{"path":"/stavim-tomcat-nastraivaem-apache-jk-konnektor/","title":"Ставим tomcat, настраиваем apache + jk коннектор","tags":["Archlinux","Java","Linux","Tomcat"]},"fileAbsolutePath":"/srv/www/softroot.ru/src/posts/2015-10-28-stavim-tomcat-nastraivaem-apache-jk-konnektor.md"}}}