<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Millancore Blog]]></title><description><![CDATA[Millancore Blog]]></description><link>https://millancore.com</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 17:26:15 GMT</lastBuildDate><atom:link href="https://millancore.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Search, Preview and Edit with Nvim]]></title><description><![CDATA[When working on the console, every millisecond counts; regardless of the tools used, the pursuit of efficiency is paramount. As a source of satisfaction, finding the best way to combine individual too]]></description><link>https://millancore.com/search-preview-and-edit-with-nvim</link><guid isPermaLink="true">https://millancore.com/search-preview-and-edit-with-nvim</guid><dc:creator><![CDATA[Juan Millan]]></dc:creator><pubDate>Wed, 25 Mar 2026 09:43:38 GMT</pubDate><content:encoded><![CDATA[<p>When working on the console, every millisecond counts; regardless of the tools used, the pursuit of efficiency is paramount. As a source of satisfaction, finding the best way to combine individual tools to achieve results leads us to explore new ways of working.</p>
<p>This small function was born from that impulse. The pattern is familiar: you search for something with ripgrep, scan through a wall of <code>file:line:match</code> output, copy a path, open it, jump to the line. Each step is trivial, but the repetition adds up. It breaks the flow.</p>
<p>So I connected three tools into a single gesture.</p>
<p><a class="embed-card" href="https://gist.github.com/millancore/20d26e7befdc58c7386e2060c9a07383">https://gist.github.com/millancore/20d26e7befdc58c7386e2060c9a07383</a></p>

<h2>The flow</h2>
<p><code>vrg &lt;pattern&gt;</code> sends your search through ripgrep, then hands the results to fzf for interactive filtering. As you move through the list, bat renders a syntax-highlighted preview of each file, with the matching line marked. When you find what you are looking for, you press enter and neovim opens exactly where you need to be. If nothing is relevant, escape and move on. Nothing opens, nothing changes.</p>
<p>The whole loop, from thought to cursor on the right line, collapses into a few keystrokes.</p>
<h2>Setup</h2>
<p>Drop the function into your <code>.bashrc</code> or <code>.zshrc</code> and make sure the four dependencies are installed: <a href="https://github.com/BurntSushi/ripgrep">ripgrep</a>, <a href="https://github.com/junegunn/fzf">fzf</a>, <a href="https://github.com/sharkdp/bat">bat</a>, and <a href="https://neovim.io/">neovim</a>.</p>
<p>If you prefer a different editor, replace <code>nvim "+\({line}" "\){file}"</code> with the equivalent command. Most editors accept a <code>+line</code> or <code>:line</code> flag.</p>
]]></content:encoded></item><item><title><![CDATA[PHP has a new Template Engine.]]></title><description><![CDATA[Pesto is a traditional Italian sauce that originated in Genoa (Liguria region), It is also the place where a new template engine for PHP is being developed, seeking simplicity, minimal code, and full compatibility with HTML.
Pesto is a project with z...]]></description><link>https://millancore.com/php-has-a-new-template-engine</link><guid isPermaLink="true">https://millancore.com/php-has-a-new-template-engine</guid><category><![CDATA[PHP]]></category><category><![CDATA[Symfony]]></category><category><![CDATA[CakePHP]]></category><category><![CDATA[Laravel]]></category><dc:creator><![CDATA[Juan Millan]]></dc:creator><pubDate>Tue, 26 Aug 2025 13:46:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1756210713580/92e707b6-3dca-4fa5-a19a-ed526cd26c5e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Pesto is a traditional Italian sauce that originated in Genoa (Liguria region), It is also the place where a new template engine for PHP is being developed, seeking simplicity, minimal code, and full compatibility with HTML.</p>
<p>Pesto is a project with zero dependencies and in constant evolution, yuo can check it directly on <a target="_blank" href="https://github.com/millancore/pesto">Github</a>.</p>
<pre><code class="lang-bash">composer require millancore/pesto
</code></pre>
<p>The first time you see the syntax, you know what's going to happen. It's expressive.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756210257292/dfe6c11c-f39f-4f0e-9393-5e38c84732aa.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-xss-security">XSS Security</h2>
<p><strong>Pesto</strong> only uses one type to print PHP expressions <code>{{ $variable }}</code>, And all of them are escaped according to the context in which they are found, whether they are in a <strong>js</strong> block, <strong>css</strong>, html <strong>attribute</strong> or comment, it is able to determine what their context is and how it should escape the values to make them secure.</p>
<p>It is also possible to specify that we do not want to escape, thanks to filters. <code>{{ $trust | raw }}</code></p>
<h2 id="heading-php-attributes">php-* Attributes</h2>
<p>Very few attributes are actually used, but they are more than enough to build interfaces.</p>
<ul>
<li><p><code>php-partial</code> To incluide other views, this is use with <code>php-with</code> to pass data to partial view.</p>
</li>
<li><p><code>php-slot</code> It is used to define the content of a slot (only named slots) defined in a partial view.</p>
</li>
<li><p><code>php-if</code> <code>php-elseif</code> <code>php-else</code> simple condition</p>
</li>
<li><pre><code class="lang-xml">  <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">php-if</span>=<span class="hljs-string">"$user-&gt;isAdmin()"</span>&gt;</span>Admin<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">php-elseif</span>=<span class="hljs-string">"$user-&gt;isModerator()"</span>&gt;</span>Moderator<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">php-else</span>&gt;</span>Guest<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
</code></pre>
<p>  <code>php-foreach</code> Iterate elements</p>
</li>
<li><pre><code class="lang-xml">  <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">php-foreach</span>=<span class="hljs-string">"$list as $item"</span>&gt;</span>{{ $item }}<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
</code></pre>
</li>
</ul>
<h2 id="heading-the-lttemplategt-tag">The &lt;template&gt; Tag</h2>
<p>We do not always want to include the HTML tag where we have defined the attribute. We can use the <code>&lt;template&gt;</code> tag, which allows us to organise the view in a better way, The <strong>template</strong> tag is <strong>not</strong> included in the final view.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">template</span> <span class="hljs-attr">php-foreach</span>=<span class="hljs-string">"$list as $item"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>{{ $item }}<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">template</span>&gt;</span>
</code></pre>
<h2 id="heading-view-composition">View Composition</h2>
<p>In Pesto, any view can be used as a partial, as many times as necessary. Simply define the slots that will have the content defined in the final view, Although the “| <strong>slot</strong>” filter is not mandatory, but provides a visual marker that defines it as a slot.</p>
<pre><code class="lang-xml"><span class="hljs-comment">&lt;!--- layouts/app.php --&gt;</span>
<span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>{{ $title }}<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">header</span>&gt;</span>{{ $header | slot }}<span class="hljs-tag">&lt;/<span class="hljs-name">header</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">main</span>&gt;</span>{{ $main | slot }}<span class="hljs-tag">&lt;/<span class="hljs-name">main</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>View:</p>
<pre><code class="lang-xml"><span class="hljs-comment">&lt;!--- views/home.php --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">template</span> <span class="hljs-attr">php-partial</span>=<span class="hljs-string">"layouts/app.php"</span> <span class="hljs-attr">php-with</span>=<span class="hljs-string">"['title' =&gt; 'Home']"</span>&gt;</span>

    <span class="hljs-comment">&lt;!-- Named slot --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">php-slot</span>=<span class="hljs-string">"header"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span>&gt;</span>Home<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/about"</span>&gt;</span>About<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>

    <span class="hljs-comment">&lt;!--Main Slot --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">section</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Home<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quae.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">section</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">template</span>&gt;</span>
</code></pre>
<p>You can find installation instructions and more detailed usage notes in the repository.</p>
<p><a target="_blank" href="https://github.com/millancore/pesto">https://github.com/millancore/pesto</a></p>
<p><strong>Thanks</strong></p>
<p>I will write several articles about pesto. I hope you enjoy them as much as I enjoyed building it.</p>
]]></content:encoded></item><item><title><![CDATA[The Memory-Efficient Guide to Blazing Fast CSV Filtering with PHP]]></title><description><![CDATA[When it comes to processing large CSV files, memory consumption can quickly become a bottleneck. Loading a 10-million-line CSV file into memory? That's a recipe for an out-of-memory error. But what if I told you that you could Filter such a file usin...]]></description><link>https://millancore.com/the-memory-efficient-guide-to-blazing-fast-csv-filtering-with-php</link><guid isPermaLink="true">https://millancore.com/the-memory-efficient-guide-to-blazing-fast-csv-filtering-with-php</guid><category><![CDATA[PHP]]></category><category><![CDATA[csv]]></category><category><![CDATA[iterator]]></category><category><![CDATA[Laravel]]></category><category><![CDATA[Symfony]]></category><dc:creator><![CDATA[Juan Millan]]></dc:creator><pubDate>Mon, 25 Nov 2024 20:13:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1732565533425/db6df54d-ac22-44c3-9a0c-6923718ec4b3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When it comes to processing large CSV files, memory consumption can quickly become a bottleneck. Loading a 10-million-line CSV file into memory? That's a recipe for an out-of-memory error. But what if I told you that you could <strong>Filter</strong> such a file using just 2MB of RAM and process it in few seconds.</p>
<p>Before diving into performance testing, you'll need a substantial dataset. Here's how to generate a 10-million-line CSV using the Faker library</p>
<pre><code class="lang-bash">composer require fakerphp/faker
</code></pre>
<p><a target="_blank" href="https://gist.github.com/millancore/565bb32cb99b4e0581ac7f03dc6aaebe">Generate dataset script whit Faker</a></p>
<p>Now that we have a dataset, we must start by reading it, the most efficient way is to use a Generator which is also an Iterator, this provide elegant approach to memory-efficient CSV processing. They're perfect for processing large datasets because they maintain their state between iterations without keeping the entire dataset in memory.</p>
<pre><code class="lang-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">readLines</span>(<span class="hljs-params"></span>) : <span class="hljs-title">Generator</span>
</span>{
    $file = fopen(<span class="hljs-keyword">__DIR__</span>.<span class="hljs-string">'/data.csv'</span>, <span class="hljs-string">'r'</span>);

    <span class="hljs-keyword">while</span> (($data = fgetcsv($file)) !== <span class="hljs-literal">false</span>) {
            <span class="hljs-keyword">yield</span> Record::fromArray($data);
    }
    fclose($file);
}
</code></pre>
<p>Now the next key piece is Filters, PHP provides the built-in <a target="_blank" href="https://www.php.net/manual/en/class.filteriterator.php">FilterIterator</a> class, which efficiently implements the filtering logic while maintaining memory efficiency when working with large datasets.</p>
<p>lets create a some filters:</p>
<pre><code class="lang-php"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AgeFilter</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">FilterIterator</span> </span>{

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span>(<span class="hljs-params">
        <span class="hljs-built_in">Iterator</span> $iterator,
        <span class="hljs-keyword">private</span> readonly <span class="hljs-keyword">int</span> $age
    </span>) </span>{
        <span class="hljs-built_in">parent</span>::__construct($iterator);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">accept</span>(<span class="hljs-params"></span>): <span class="hljs-title">bool</span>
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">$this</span>-&gt;current()-&gt;age == <span class="hljs-keyword">$this</span>-&gt;age;
    }
}
</code></pre>
<pre><code class="lang-php"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GenderFilter</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">FilterIterator</span> </span>{

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span>(<span class="hljs-params">
        <span class="hljs-built_in">Iterator</span> $iterator,
        <span class="hljs-keyword">private</span> readonly <span class="hljs-keyword">string</span> $gender
    </span>) </span>{
        <span class="hljs-built_in">parent</span>::__construct($iterator);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">accept</span>(<span class="hljs-params"></span>): <span class="hljs-title">bool</span>
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">$this</span>-&gt;current()-&gt;gender == <span class="hljs-keyword">$this</span>-&gt;gender;
    }
}
</code></pre>
<p>Next, we need to create a filter chain to process the previous result. To simplify this task, we can leverage the <strong>PipelineFilterIterator</strong> library.</p>
<pre><code class="lang-bash">composer require millancore/pipeline-iterator
</code></pre>
<pre><code class="lang-php"><span class="hljs-keyword">use</span> <span class="hljs-title">Millancore</span>\<span class="hljs-title">PipelineIterator</span>\<span class="hljs-title">PipelineFilterIterator</span>;

$iterator = PipelineFilterIterator::create(readLines())
    -&gt;filter(GenderFilter::class, <span class="hljs-string">'F'</span>)
    -&gt;filter(AgeFilter::class, <span class="hljs-number">30</span>);

<span class="hljs-keyword">foreach</span>($iterator <span class="hljs-keyword">as</span> $item) {
   <span class="hljs-keyword">echo</span> $item-&gt;name.PHP_EOL;
}

<span class="hljs-comment">/**
* Records: 10.000.000
* File size: 227 MiB
* Time: 7.65 seconds
* Memory: 2 MB
*/</span>
</code></pre>
<p>It's that simple! This approach ensures our filters are reusable, testable, and easily combinable to suit your needs.</p>
<h3 id="heading-bonus">Bonus</h3>
<p>You can use built-in Filters as <a target="_blank" href="https://www.php.net/manual/en/class.callbackfilteriterator.php"><strong>CallbackFilterIterator</strong></a> <strong>or</strong> <a target="_blank" href="https://www.php.net/manual/en/class.regexiterator.php"><strong>RegexIterator</strong></a></p>
<pre><code class="lang-php"> <span class="hljs-comment"># Regex filter names containing 'ana'</span>
 -&gt;filter(<span class="hljs-built_in">RegexIterator</span>::class, <span class="hljs-string">'/ana/'</span>)
</code></pre>
<blockquote>
<p>To use RegexIterator the class must implement __toString to apply the filter.</p>
</blockquote>
<h3 id="heading-thanks">Thanks</h3>
]]></content:encoded></item><item><title><![CDATA[De PHP a GO Capitulo 3 - Arreglos y otras cosas!]]></title><description><![CDATA[Capitulo Anterior:  De PHP a GO Capitulo 2 - "Objetos" 
El universo esta hecho de Arrays, después de el Hidrogeno los arreglos son el elemento mas abundante a donde quieras que mires.
Regresando a nuestro amando PHP donde los arreglos se definen con ...]]></description><link>https://millancore.com/de-php-a-go-capitulo-3-arreglos-y-otras-cosas</link><guid isPermaLink="true">https://millancore.com/de-php-a-go-capitulo-3-arreglos-y-otras-cosas</guid><category><![CDATA[PHP]]></category><category><![CDATA[Go Language]]></category><category><![CDATA[golang]]></category><category><![CDATA[go]]></category><dc:creator><![CDATA[Juan Millan]]></dc:creator><pubDate>Wed, 04 Mar 2020 16:32:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1583339641925/KyMhhxmqL.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Capitulo Anterior:</strong>  <a target='_blank' rel='noopener noreferrer'  href="https://millancore.com/de-php-a-go-capitulo-2-objetos-ck79alzxc08qyd9s1m8q4o2ay">De PHP a GO Capitulo 2 - &quot;Objetos&quot;</a> </p>
<p>El universo esta hecho de Arrays, después de el Hidrogeno los arreglos son el elemento mas abundante a donde quieras que mires.</p>
<p>Regresando a nuestro amando PHP donde los arreglos se definen con abundancia, soportando todo tipo de datos y en cantidades escandalosas, no nos viene mal aprender un poco de mesura y austeridad.</p>
<p>Y es que GO es ese padre que nos reprende en pro de disciplinarnos pero luego se apiada de nosotros y nos da formas mas sencillas de hacer las cosas.</p>
<h2 id="arrays">Arrays</h2>
<p>Como ya lo sospecharas, los arrays tiene un tamaño y un tipo definido, esto hace que se reserve en memoria solo una vez.</p>
<pre><code class="lang-go"><span class="hljs-keyword">var</span> names [<span class="hljs-number">3</span>]<span class="hljs-keyword">string</span>
</code></pre>
<p>Si no le asignamos un valor a la hora de definir un array todos sus elementos se inician el <strong>0</strong> en caso de ser numéricos, <strong>&quot;&quot;</strong> para string y <strong>false</strong> para booleanos.</p>
<p>Pero GO sabe de nuestro turbio pasado y que a lo mejor ponernos a contar cuantos elementos tiene nuestro arreglo hará que abandonemos todo, así que nos permite definirlo de una manera en la que él cuenta los elementos por nosotros (vagos!!).</p>
<pre><code class="lang-go">names := [...]<span class="hljs-keyword">string</span>{<span class="hljs-string">"esto"</span>, <span class="hljs-string">"es"</span>,<span class="hljs-string">"el"</span>,<span class="hljs-string">"colmo!"</span>}
</code></pre>
<p>Pero no os emocionéis, siguen siendo inmutables!</p>
<p>Algo curioso con lo que nos podemos encontrar a la hora de crear arreglos con elemento de tipo String con mas de una palabra es que a la hora de imprimirlos no sabemos donde comienza o termina cada elemento.</p>
<pre><code class="lang-go">names := [<span class="hljs-number">3</span>]<span class="hljs-keyword">string</span>{<span class="hljs-string">"Miguel Angel"</span>, <span class="hljs-string">"Picasso"</span>,<span class="hljs-string">"Vincent van Gogh"</span>}
fmt.Println(names)
</code></pre>
<pre><code>[Miguel Angel Picasso Vincent van Gogh]
</code></pre><p>Esto se soluciona fácilmente haciendo una impresión con formato <code>quote</code></p>
<pre><code class="lang-go">fmt.Printf(<span class="hljs-string">"%q"</span>, names)
</code></pre>
<p>Aqui las diferentes opciones de formato  <a target='_blank' rel='noopener noreferrer'  href="https://golang.org/pkg/fmt/">fmt</a></p>
<h2 id="slices">Slices</h2>
<p>Y aquí viene nuestro padre bondadoso luego de vernos luchar infructuosamente con nuestra falta de detenimiento a pensar que a lo mejor los elementos que estamos almacenando no van a cambiar de tamaño.</p>
<p>Y es que los Slices nos permiten tener arreglos dinámicos en relación a su tamaño.</p>
<p>Pero antes de tomar la magia y hacernos fanáticos ciegamente, viene bien saber que los Slices son una envoltura de los arreglos y realmente no almacenan nuestros datos si no que hacen referencia a un Array.</p>
<p>Cuando nosotros cortamos un Array lo que estamos generando es un Slice (de ahí su definición) un arreglo lo podemos cortar de la siguiente manera.</p>
<pre><code class="lang-go">numbers := [<span class="hljs-number">5</span>]<span class="hljs-keyword">int</span>{<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>}
sliceFromNumbers := numbers[<span class="hljs-number">0</span>:<span class="hljs-number">3</span>]
</code></pre>
<p>Para definir un Slice sin hacer un corte basta con que  <strong>NO definamos</strong> el numero de elementos a contener.</p>
<pre><code class="lang-go">names := []<span class="hljs-keyword">string</span>{<span class="hljs-string">"Miguel Angel"</span>, <span class="hljs-string">"Picasso"</span>,<span class="hljs-string">"Vincent van Gogh"</span>}
names = <span class="hljs-built_in">append</span>(names, <span class="hljs-string">"Salvador Dali"</span>)
</code></pre>
<p>Una buena practica es usar  <a target='_blank' rel='noopener noreferrer'  href="https://golang.org/pkg/builtin/#make">make</a> de esa manera se puede iniciar un numero de elementos y/o definir el tamaño del Slice.</p>
<pre><code class="lang-go">numbers := <span class="hljs-built_in">make</span>([]<span class="hljs-keyword">int</span>, <span class="hljs-number">6</span>, <span class="hljs-number">18</span>)
</code></pre>
<p>Y como no todo puede ser paz y armonía, una vez has agregado elementos a un Slice te preguntas instintivamente, ¿como se eliminan?, estarás confiando de que habrá algún método para hacerlo de manera simple y elegante, pero... No!!</p>
<p>Para quitar un elemento, se debe cortar los elementos antes de ese elemento, cortar los elementos después de ese elemento y a continuación, anexar estos dos nuevos Slices juntos sin el elemento que se desea quitar.</p>
<blockquote>
<p>Asi como leiste! yo lo he apuntado en un papel para meditarlo cuando la vida se me complica y de alguna forma me da esperanza de que mis problemas cotidianos son mas triviales.</p>
</blockquote>
<p>Si deseamos eliminar el elemento con indexe 2 lo que debemos hacer es lo siguiente.</p>
<pre><code class="lang-go">names = <span class="hljs-built_in">append</span>(names[:<span class="hljs-number">2</span>], names[<span class="hljs-number">3</span>:]...)
</code></pre>
<p>Si estas pensando hacer una función de borrado no os lo recomiendo, (yo también lo pensé) ya que tendrás que hacer una por cada tipo, solo déjalo ir, luego de un rato ya ni notas su extraña forma.</p>
<h3 id="maps">Maps</h3>
<p>En GO también tenemos los arreglos asociativos de los que tanto hacemos uso en PHP solo que debemos de tener en cuenta que las claves y los valores solo pueden ser de un tipo cada una.</p>
<pre><code class="lang-go">record := <span class="hljs-keyword">map</span>[<span class="hljs-keyword">string</span>]<span class="hljs-keyword">string</span>{<span class="hljs-string">"status"</span>: <span class="hljs-string">"open"</span>, <span class="hljs-string">"type"</span>: <span class="hljs-string">"red"</span>}
</code></pre>
<p>Y se puede acceder, modificar o agregar elementos de la mimas forma que los hacemos en PHP.</p>
<pre><code class="lang-go"><span class="hljs-comment">// Add</span>
record[<span class="hljs-string">"newKey"</span>] = <span class="hljs-string">"newValue"</span>

<span class="hljs-comment">// Modify</span>
record[<span class="hljs-string">"status"</span>] = <span class="hljs-string">"close"</span>

<span class="hljs-comment">//Use </span>
fmt.Println(record[<span class="hljs-string">"type"</span>])
</code></pre>
<p>Y para <strong>eliminar</strong> lo bueno es que ya estas preparado para formas únicas y novedosas de borrar elementos. </p>
<pre><code class="lang-go"><span class="hljs-built_in">delete</span>(record, <span class="hljs-string">"type"</span>)
</code></pre>
<p>Jajajajaja! inesperado!! GO es una montaña rusa de emociones! </p>
]]></content:encoded></item><item><title><![CDATA[De PHP a GO Capitulo 2 - "Objetos"]]></title><description><![CDATA[Capitulo Anterior:  De PHP a GO - Comienzo

El viejo C tenia razón y es que a lo mejor no se necesitan los objectos tal y como los conocemos para hacer software robusto y por que muy dentro de nosotros sabíamos que en el paradigma orientado a objetos...]]></description><link>https://millancore.com/de-php-a-go-capitulo-2-objetos</link><guid isPermaLink="true">https://millancore.com/de-php-a-go-capitulo-2-objetos</guid><category><![CDATA[PHP]]></category><category><![CDATA[Go Language]]></category><category><![CDATA[go]]></category><category><![CDATA[golang]]></category><dc:creator><![CDATA[Juan Millan]]></dc:creator><pubDate>Sun, 01 Mar 2020 17:12:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1583082751035/kfvVxakbr.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Capitulo Anterior</strong>:  <a target='_blank' rel='noopener noreferrer'  href="https://millancore.com/de-php-a-go-comienzo-ck76dvxi407zxd9s1ylid4eia">De PHP a GO - Comienzo</a></p>
<hr>
<p>El viejo <strong>C</strong> tenia razón y es que a lo mejor no se necesitan los objectos tal y como los conocemos para hacer software robusto y por que muy dentro de nosotros sabíamos que en el paradigma orientado a objetos habían ciertos vacíos que los dejamos a la fe para no complicar mas las cosas.</p>
<p>En GO volvemos a las probadas estructuras, las estructuras son un tipo de datos (Si un tipo de datos!), que los permite crear una colección de campos con sus respectivos tipos.</p>
<blockquote>
<p>Ya podes ir tirando por la ventana todo los sabias de orientación a objectos!! pero con cuidado que rescataremos un par de cosas.</p>
</blockquote>
<p>Las estructuras son muy simples y sencillas de definir y dentro de sus campos pueden tener otras estructuras.</p>
<pre><code class="lang-go"><span class="hljs-keyword">type</span> User <span class="hljs-keyword">struct</span> {
    id <span class="hljs-keyword">int</span>
    firstName <span class="hljs-keyword">string</span>
    lastName <span class="hljs-keyword">string</span>
    age <span class="hljs-keyword">int</span>
}
</code></pre>
<p>Y para instanciarlas</p>
<pre><code class="lang-go"> juan := User{<span class="hljs-number">1</span>, <span class="hljs-string">"Juan"</span>, <span class="hljs-string">"Millan"</span>, <span class="hljs-number">30</span>}
</code></pre>
<p>Ya que la creación de la estructura es muy similar a la de los objetos de Javascript yo prefiero por comodidad mental hacerlo con sus claves (y por que se ve mas bonito ñ_ñ).</p>
<pre><code class="lang-go">juan := User{id: <span class="hljs-number">1</span>, firstName: <span class="hljs-string">"Juan"</span>, lastName: <span class="hljs-string">"Millan"</span>, age: <span class="hljs-number">30</span>}
</code></pre>
<p>Y para acceder a sus campos basta con hacer <code>juan.firstName</code>.</p>
<h2 id="y-los-m-todos-">Y los métodos?</h2>
<p>Conociendo las ansias ya se estarán preguntando por los métodos, pero no hay nada de que preocuparse GO nos permite crear métodos y vincularlos a las estructuras.</p>
<p>Los métodos se crean fuera de la estructura (no hay que complicar las cosas) y se vinculan con un <strong>receptor </strong> el receptor se ubica entre la palabra <code>func</code> y la definición de la función.</p>
<pre><code class="lang-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">( u User)</span> <span class="hljs-title">fullName</span><span class="hljs-params">()</span> <span class="hljs-title">string</span></span> {
    <span class="hljs-keyword">return</span> u.firstName + <span class="hljs-string">" "</span> + u.lastName
}
</code></pre>
<p>Como podemos ver antes de definir el nombre de nuestro método hemos agregado el receptor <code>u User</code> que vincula la función con la estructura.</p>
<blockquote>
<p>Pero ojo al puntero! Jajajajaja</p>
</blockquote>
<h2 id="punteros">Punteros</h2>
<p>El método anterior esta bien pero estamos pasando la estructura por valor y no por referencia por lo que si deseamos modificar algo de la estructura mediante un método necesitamos usar punteros. </p>
<p>Los puntero son una de las características mas poderosas de <strong>C</strong>  que nos permiten llevar el lenguaje a puntos insospechados sobrepasando las barreras de tiempo y el espacio (sacando las referencias desde el registro de memoria).</p>
<p>GO implementa punteros en su definición mas simple, sin la aritmética de punteros ya que de hacerlo <strong>podríamos tirarnos por la ventana también!.</strong></p>
<p>Si no has tenido la oportunidad de trabajar con punteros os los explicare de una manera simple.</p>
<p>cuando definimos una variable, estructura etc, para este elemento se crea una referencia en memoria y esta referencia la podemos almacenar en otra variable pero de tipo <strong>puntero</strong>.</p>
<blockquote>
<p>Puede parecer confuso definir una variable de tipo puntero por que el tipo puntero solo es una referencia en memoria, pero puede ser una referencia en memoria de tipo entero, string, bool o strutc por ello a la hora de definirlo ponemos el tipo.</p>
</blockquote>
<pre><code class="lang-go"> <span class="hljs-keyword">var</span> punteroInt *<span class="hljs-keyword">int</span>
 <span class="hljs-keyword">var</span> punteroUser *User
</code></pre>
<p>Supongamos que definimos la variable <code>nombre := &quot;Juan&quot;</code> en memoria tendrá la siguiente referencia <code>0xc0000120a0</code> nosotros podemos almacenar esa referencia en un puntero de la siguiente manera <code>puntero = &amp;nombre</code> y luego si queremos modificar el valor de la variable <em>nombre</em> lo podemos hacer a través del puntero presidiendolo con un asterisco <code>*puntero = &quot;Esteban&quot;</code></p>
<blockquote>
<p>No os preocupes si no se comprende del todo al principio, el conocimiento ira filtrando las capas del cerebro hasta llegar al centro y allí sentirás la iluminación de los punteros.</p>
</blockquote>
<p>Volviendo a los métodos de nuestra estructura creemos uno que si nos permita modificar lo valores de esta. </p>
<pre><code class="lang-go"><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(p *User )</span> <span class="hljs-title">birthday</span><span class="hljs-params">()</span></span>  {
     p.age ++
}
</code></pre>
<p>De esta manera cada vez que se llame el método <code>juan.birthday()</code> tendré un año mas!</p>
<p>Y ya me preguntaran y por que no usaste en el método <strong>*p.age ++</strong>  y.. GO sabrá como hacer sus cosas!, esto sucede por estamos accediendo a la propiedad <code>age</code> GO detecta automáticamente que se trata del elemento que hay detrás de la referencia en memoria.</p>
<h2 id="interfaces">Interfaces</h2>
<p>Si hay algo que funciona perfectamente en el paradigma orientado a objetos son las interfaces esa capacidad de hacer las cosas modulares e intercambiables es sin lugar a dudas uno de los grandes aciertos. </p>
<p>En PHP una interfaz es un contrato que obliga a la clase que la implementa a cumplir con una serie de métodos, en muchas ocasiones nos hemos visto rellenar métodos vacíos solo para cumplir con un contrato ya que a lo mejor solo vamos a usar una de ellos en nuestra implementación. </p>
<p>En GO las interfaces no condicionan a las estructuras, de esa manera la modularidad es mucho mas amplia ya que cuando definimos un parámetro del tipo de una interfaz, a la hora de pasar el valor del parámetros se validara que cuente con los métodos definidos en la interfaz.</p>
<p>Por lo general las interfaces en GO se definen con la terminación &quot;er&quot; sin importar las raras combinaciones que se puedan llegar a dar.</p>
<pre><code class="lang-go"><span class="hljs-keyword">type</span> Executer <span class="hljs-keyword">interface</span> {
      execute()
}
</code></pre>
<p>Una vez definida la interfaz solo basta con que vinculemos a la estructura un método con la misma firma.</p>
<pre><code class="lang-go"><span class="hljs-keyword">type</span> MyRequest <span class="hljs-keyword">struct</span> {
    command <span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">()</span>
}

<span class="hljs-title">func</span> <span class="hljs-params">(t MyRequest)</span> <span class="hljs-title">execute</span><span class="hljs-params">()</span></span> {
    t.command()
}
</code></pre>
<p>Y esta ya podrá ser usada donde se haya definido un parámetro del tipo <strong>Executer</strong>.</p>
<p>También podemos crear interfaces que contengan a otras esto nos brinda la posibilidad de hacerlas muy simples y reutilizables </p>
<pre><code class="lang-go"><span class="hljs-keyword">type</span> Reader <span class="hljs-keyword">interface</span> {
    Read(b []<span class="hljs-keyword">byte</span>) (n <span class="hljs-keyword">int</span>, err error)
}

<span class="hljs-keyword">type</span> Writer <span class="hljs-keyword">interface</span> {
    Write(b []<span class="hljs-keyword">byte</span>) (n <span class="hljs-keyword">int</span>, err error)
}

<span class="hljs-keyword">type</span> ReadWriter <span class="hljs-keyword">interface</span> {
    Reader
    Writer
}
</code></pre>
<p><strong>Siguente Capitulo: </strong>   <a target='_blank' rel='noopener noreferrer'  href="https://millancore.com/de-php-a-go-arreglos-y-otras-cosas-ck7djh5io0abld9s17clo2hy4">De PHP a GO Capitulo 3 - Arreglos</a> </p>
<hr>
<p>Ya sabes que me podes dejar comentarios aquí o escribirme por twitter a @millancore</p>
]]></content:encoded></item><item><title><![CDATA[De PHP a Go - Comienzo]]></title><description><![CDATA[Últimamente he tenido la oportunidad de trabajar con GO después de resistirme mucho ya que PHP siempre guarda un espacio en mi corazón, sin embargo una parte de mi es partidaria de que cada lenguaje aporta lo suyo.
En este viaje daré mi visión person...]]></description><link>https://millancore.com/de-php-a-go-comienzo</link><guid isPermaLink="true">https://millancore.com/de-php-a-go-comienzo</guid><category><![CDATA[PHP]]></category><category><![CDATA[PHP7]]></category><category><![CDATA[go]]></category><dc:creator><![CDATA[Juan Millan]]></dc:creator><pubDate>Fri, 28 Feb 2020 16:21:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1582907023613/KyUFIQA-Q.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Últimamente he tenido la oportunidad de trabajar con <strong>GO</strong> después de resistirme mucho ya que <strong>PHP </strong>siempre guarda un espacio en mi corazón, sin embargo una parte de mi es partidaria de que cada lenguaje aporta lo suyo.</p>
<p>En este viaje daré mi visión personal de como se ve GO desde las perspectiva de un desarrollador PHP.</p>
<h2 id="compilado">Compilado</h2>
<p>Si hay algo que disfrutamos en PHP es modificar algo e ir a ver el resultado abusando de la &quot;magia&quot; de ser un lenguaje interpretado, GO es un lenguaje compilado, pero lo creadores en su inmensa sabiduría y teniendo en cuenta lo ansiosos que solemos ser los desarrolladores han creado un <strong>compila-y-ejecuta</strong> asi podemos dejar la compilación para el final cuando ya estemos seguros de que no haremos cambios.</p>
<pre><code class="lang-bash">go run script.go
</code></pre>
<h2 id="declaraci-n-de-variables">Declaración de variables</h2>
<p>No es un secreto para nadie que a la hora de declarar variables los que trabajamos con PHP somos de lo mas sucio de la industria (no nos molesta), declaramos variables sin pensar en el tipo o definir un valor inicial.</p>
<p>GO es un lenguaje de tipado fuerte lo que nos indica que debemos de declarar el tipo de nuestras variables y su valor inicial, pero <strong>tiene truco</strong> y esto se agradece mucho cuando vienes de PHP (Que difícil enderezar un árbol).</p>
<p>Para que GO difiera automáticamente el tipo de una variable podemos usar una sintaxis de declaración especial usando <code>:=</code> siempre y cuando estén dentro de una función.</p>
<pre><code class="lang-go"> myVariable := <span class="hljs-number">12</span>
</code></pre>
<p>Algo a tener muy en cuenta es que las variables de tipo <code>string</code> <strong>NO se declaran con comillas simples</strong>, ya podes iros preparando para ver como se rompe todo.</p>
<p>Y ni que decir de que el <strong>punto y coma</strong> <em>;</em>  al final de las sentencias no se usa (<strong>Es broma, lo podes usar!!</strong>) pero lo mas común es que no se use.</p>
<blockquote>
<p>Si están trabajando con tipos de datos que requieren precisión lo mas recomendable es que se tomen la molestia de declararlos!</p>
</blockquote>
<h2 id="paquetes">Paquetes</h2>
<p>En PHP estamos muy acostumbrados a que las funciones del lenguaje se encuentren de manera global, no necesitamos incluir un <code>USE</code> para hacer uso de <code>print</code>, <code>rand</code>, <code>time</code> etc, por otro lado en GO debemos importar sus  <a target='_blank' rel='noopener noreferrer'  href="https://golang.org/pkg/">paquetes </a> para hacer uso de ellas.</p>
<pre><code class="lang-go"><span class="hljs-keyword">package</span> main

<span class="hljs-keyword">import</span> (
    <span class="hljs-string">"fmt"</span>
    <span class="hljs-string">"time"</span>
    <span class="hljs-string">"math"</span>
    <span class="hljs-string">"encoding/json"</span>
)
</code></pre>
<h2 id="funciones">Funciones</h2>
<p>La parte mas gratificante (en mi experiencia) han sido las funciones de GO, son bastante sencillas de definir pero tienen un par de detalles que se agradece en demasía.</p>
<pre><code class="lang-go">   <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">myFunc</span><span class="hljs-params">(a <span class="hljs-keyword">int</span>, b <span class="hljs-keyword">int</span>)</span> <span class="hljs-title">int</span></span> {

   }
</code></pre>
<p>Lo primero que se debe tener en cuenta es que <strong>las variables van antes de los tipos</strong> (al principio costara) una vez integrado esto podemos comenzar a ver sus características especiales. </p>
<ol>
<li><p>Si todos los parámetros son del mismo tipo basta con solo definir el <strong>ultimo</strong> <code>func myFunc(a, b int)</code>.</p>
</li>
<li><p>Se pueden retornar mas de un parámetro!!  Sii (yo casi lloro) <code>return, a, b</code> y en la llamada los recibes en orden <code>resultA, resultB := myFunc(12, 3)</code></p>
</li>
<li><p>Puedes definir variables de retorno directamente en la definición de la función y estas re retornaran automáticamente. (Esto ya es demasiado).</p>
</li>
</ol>
<pre><code class="lang-go">   <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">myFunc</span><span class="hljs-params">(a, b <span class="hljs-keyword">int</span>)</span> <span class="hljs-params">(c <span class="hljs-keyword">int</span>)</span></span> {
        c := a + b
       <span class="hljs-keyword">return</span>
   }
</code></pre>
<p><strong><em>Siguente Capitulo</em></strong>:   <a target='_blank' rel='noopener noreferrer'  href="https://millancore.com/de-php-a-go-capitulo-2-objetos-ck79alzxc08qyd9s1m8q4o2ay">De PHP a GO Capitulo 2 - &quot;Objetos&quot;</a> </p>
<p>Ya sabes que me podes dejar comentarios aquí o escribirme por twitter a @millancore</p>
]]></content:encoded></item><item><title><![CDATA[How to use laravel Schedule in non-Laravel applications]]></title><description><![CDATA[Although Laravel is not available in a modular way like Symfony, we can separate its best features if we know how it works.
The most important thing is to know that the Application. "is just an instance of Container" Container 
Nothing to fear!
To ex...]]></description><link>https://millancore.com/how-to-use-laravel-schedule-in-non-laravel-applications</link><guid isPermaLink="true">https://millancore.com/how-to-use-laravel-schedule-in-non-laravel-applications</guid><category><![CDATA[PHP]]></category><category><![CDATA[Laravel]]></category><dc:creator><![CDATA[Juan Millan]]></dc:creator><pubDate>Tue, 26 Nov 2019 00:45:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1574729592603/wlOM0nptj.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Although Laravel is not available in a modular way like <strong>Symfony</strong>, we can separate its best features if we know how it works.</p>
<p>The most important thing is to know that the Application. &quot;is just an instance of Container&quot; <a target='_blank' rel='noopener noreferrer'  href="https://github.com/illuminate/container">Container</a> </p>
<p>Nothing to fear!</p>
<p>To extract any feature of Laravel we just need to create our Application, The heart of it all.</p>
<p>This is the Schedule outside of Laravel  <a target='_blank' rel='noopener noreferrer'  href="https://github.com/millancore/illuminate-schedule">Illuminate Schedule</a></p>
<h3 id="enjoy-it-">Enjoy it!</h3>
]]></content:encoded></item><item><title><![CDATA[Laravel ( Illuminate ) Components - Schedule]]></title><description><![CDATA[Este no es un componente pero si la joya de la corona del Console de Laravel por lo que merece un tratamiento especial.
En este capitulo veremos como usar el  Schedule  de Laravel fuera del framework para que podamos usarlo como mejor nos parezca.
Lo...]]></description><link>https://millancore.com/laravel-illuminate-components-schedule</link><guid isPermaLink="true">https://millancore.com/laravel-illuminate-components-schedule</guid><category><![CDATA[Laravel]]></category><category><![CDATA[PHP]]></category><dc:creator><![CDATA[Juan Millan]]></dc:creator><pubDate>Fri, 22 Nov 2019 15:50:41 GMT</pubDate><content:encoded><![CDATA[<p>Este no es un componente pero si la joya de la corona del <strong>Console</strong> de Laravel por lo que merece un tratamiento especial.</p>
<p>En este capitulo veremos como usar el  <a target='_blank' rel='noopener noreferrer'  href="https://laravel.com/docs/5.8/scheduling">Schedule </a> de Laravel fuera del framework para que podamos usarlo como mejor nos parezca.</p>
<p>Lo primero que vamos hacer es crear un archivo de ejecución con nombre de <code>artisan</code> (ya que se no hace familiar), este sera el que ejecutara nuestro cron tal como esta en la documentación.</p>
<pre><code><span class="hljs-bullet">* </span><span class="hljs-bullet">* *</span> <span class="hljs-bullet">* *</span> cd /path-to-your-project &amp;&amp; php artisan schedule:run &gt;&gt; /dev/null 2&gt;&amp;1
</code></pre><p>Antes de comenzar os dejo el  <a target='_blank' rel='noopener noreferrer'  href="https://github.com/millancore/illuminate-schedule">repo de github</a> , por que a veces es mas sencillo ver todo desde alli! :D</p>
<p>Veamos nuestro artisan</p>
<pre><code class="lang-php"><span class="hljs-comment">#!/usr/bin/env php</span>
<span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">use</span> <span class="hljs-title">Schedule</span>\<span class="hljs-title">Kernel</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Schedule</span>\<span class="hljs-title">Application</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Events</span>\<span class="hljs-title">Dispatcher</span>;

<span class="hljs-keyword">require</span> <span class="hljs-keyword">__DIR__</span>.<span class="hljs-string">'/vendor/autoload.php'</span>;

$app = <span class="hljs-keyword">new</span> Application;

$app[<span class="hljs-string">'config'</span>] = [
    <span class="hljs-string">'cache.default'</span> =&gt; <span class="hljs-string">'file'</span>,
    <span class="hljs-string">'cache.stores.file'</span> =&gt; [
        <span class="hljs-string">'driver'</span> =&gt; <span class="hljs-string">'file'</span>,
        <span class="hljs-string">'path'</span> =&gt; <span class="hljs-keyword">__DIR__</span> . <span class="hljs-string">'/cache'</span>
    ]
];

$app[<span class="hljs-string">'files'</span>] = <span class="hljs-keyword">new</span> Filesystem;

$kernel = <span class="hljs-keyword">new</span> Kernel($app, <span class="hljs-keyword">new</span> Dispatcher($app));

$kernel-&gt;handle(
    <span class="hljs-keyword">new</span> Symfony\Component\Console\Input\ArgvInput,
    <span class="hljs-keyword">new</span> Symfony\Component\Console\Output\ConsoleOutput
);
</code></pre>
<p>Ahora veamos de que va esto, tenemos un Application y un Kernel que se encargara de manejar los diferentes comandos que le pasamos a nuestro artisan.</p>
<p>El <strong>Application</strong> de Laravel solo es un Container vitaminizado, así que nosotros crearemos nuestro Application solo con las cosas que necesita nuestro Schedule.</p>
<p>veamos las dependencias para nuestro proyecto antes de continuar</p>
<pre><code>{
    "<span class="hljs-attr">require</span>": {
        "<span class="hljs-attr">illuminate/console</span>": <span class="hljs-string">"^5.8"</span>,
        "<span class="hljs-attr">illuminate/events</span>": <span class="hljs-string">"^5.8"</span>,
        "<span class="hljs-attr">illuminate/cache</span>": <span class="hljs-string">"^5.8"</span>,
        "<span class="hljs-attr">illuminate/filesystem</span>": <span class="hljs-string">"^5.8"</span>,
        "<span class="hljs-attr">dragonmantank/cron-expression</span>": <span class="hljs-string">"^2.3"</span>
    },
    "<span class="hljs-attr">autoload</span>": {
        "<span class="hljs-attr">psr-4</span>": {
            "<span class="hljs-attr">Schedule\\</span>": <span class="hljs-string">"src/"</span>
        },
        "<span class="hljs-attr">files</span>": [
            <span class="hljs-string">"helpers.php"</span>
        ]
    }
}
</code></pre><p>Ahora si el <strong>Application</strong></p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">namespace</span> <span class="hljs-title">Schedule</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Cache</span>\<span class="hljs-title">CacheManager</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Console</span>\<span class="hljs-title">Scheduling</span>\<span class="hljs-title">CacheEventMutex</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Console</span>\<span class="hljs-title">Scheduling</span>\<span class="hljs-title">EventMutex</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Container</span>\<span class="hljs-title">Container</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Contracts</span>\<span class="hljs-title">Cache</span>\<span class="hljs-title">Factory</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Application</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Container</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">()</span>
    </span>{
        $this-&gt;registerBaseBindings();
        $this-&gt;registerScheduleBindings();
    }

    <span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">registerBaseBindings</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-keyword">static</span>::setInstance($this);
    }

    <span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">registerScheduleBindings</span><span class="hljs-params">()</span>
    </span>{
        $this-&gt;bind(
            Factory::class,
            <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">($app)</span> </span>{
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> CacheManager($app);
            }
        );

        $this-&gt;bind(EventMutex::class, CacheEventMutex::class);
        $this-&gt;bind(SchedulingMutex::class, CacheSchedulingMutex::class);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">environment</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-string">'prod'</span>;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">isDownForMaintenance</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
    }
}
</code></pre>
<p>Es un Application bastante sencillo como podemos ver, tenemos un <code>registerBaseBindings</code> que se encarga de setear nuestra instancia para que librerías que usan el container puedan acceder a este de manera global, luego tenemos un <code>registerScheduleBindings</code> en donde registramos un CacheManager y los <strong>Mutex</strong> estos ultimos se encarga de asignar un ID unico a los los eventos y al schedule para que no se solapen y se guardan en cache para que hacer el proceso mas eficiente.</p>
<p>Luego tenemos un <code>environment</code> y <code>isDownForMaintenance</code> , el primero donde retornamos nuestro entorno, muy util si tenemos tareas en nuestro Schedule con diferentes entornos y el segundo es para apagar el Schedule ambas que pueden llevar a un archivo de configuración.  (os dejo los cambio menores).</p>
<p>Ahora desmosle una mirada al nuestro Kernel</p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">namespace</span> <span class="hljs-title">Schedule</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Console</span>\<span class="hljs-title">Application</span> <span class="hljs-title">as</span> <span class="hljs-title">Artisan</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Console</span>\<span class="hljs-title">Scheduling</span>\<span class="hljs-title">Schedule</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Console</span>\<span class="hljs-title">Scheduling</span>\<span class="hljs-title">ScheduleRunCommand</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Events</span>\<span class="hljs-title">Dispatcher</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Kernel</span>
</span>{
    <span class="hljs-keyword">protected</span> $app;
    <span class="hljs-keyword">protected</span> $artisan;
    <span class="hljs-keyword">protected</span> $events;

    <span class="hljs-keyword">protected</span> $commands = [
        <span class="hljs-comment">#Register command here!!</span>
    ];

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">(Application $app, Dispatcher $events)</span>
    </span>{
        $this-&gt;app = $app;
        $this-&gt;events = $events;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">handle</span><span class="hljs-params">($input, $output = null)</span>
    </span>{
        $this-&gt;bootstrap();
        <span class="hljs-keyword">return</span> $this-&gt;getArtisan()-&gt;run($input, $output);
    }

    <span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">schedule</span><span class="hljs-params">(Schedule $schedule)</span>
    </span>{
         <span class="hljs-comment">#Schedule comands here!!</span>
    }

    <span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">bootstrap</span><span class="hljs-params">()</span>
    </span>{
        $schedule = <span class="hljs-keyword">new</span> Schedule();

        $this-&gt;getArtisan()-&gt;add(
            <span class="hljs-keyword">new</span> ScheduleRunCommand($schedule)
        );

        $this-&gt;schedule($schedule);
    }

    <span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getArtisan</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-keyword">if</span> (is_null($this-&gt;artisan)) {
            <span class="hljs-keyword">return</span> $this-&gt;artisan = (<span class="hljs-keyword">new</span> Artisan($this-&gt;app, $this-&gt;events, <span class="hljs-string">'5.8'</span>))
                -&gt;resolveCommands($this-&gt;commands);
        }
        <span class="hljs-keyword">return</span> $this-&gt;artisan;
    }
}
</code></pre>
<p>Tenemos como de costumbre un Array donde registrar nuestros commands y un método schedule donde agregaremos nuestras tareas. Toda la lógica de ejecución reside en el método <strong>handle</strong> que se encargara de resolver los comandos que le pasamos a artisan.</p>
<p>Y por ultimo tenemos un helper que usa Schedule para saber donde esta parado :D </p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">if</span> (! function_exists(<span class="hljs-string">'base_path'</span>)) {
    <span class="hljs-comment">/**
     * Get the path to the base of the install.
     *
     * <span class="hljs-doctag">@param</span>  string  $path
     * <span class="hljs-doctag">@return</span> string
     */</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">base_path</span><span class="hljs-params">($path = <span class="hljs-string">''</span>)</span>
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">__DIR__</span>;
    }
}
</code></pre>
<p>Nunca fue tan fácil usar Schedule! </p>
<p>Espero os sea de ayuda! Alguna duda o sugerencia la podéis dejar como comentario o hacerme una mencion en twitter @millancore</p>
]]></content:encoded></item><item><title><![CDATA[Laravel (illuminate) Components - Validation]]></title><description><![CDATA[Algunas personas no podemos dormir sin saber como funcionan las cosas de fondo, nos puede la curiosidad y deseamos destapar todo, por que a lo mejor desarmar la radio cuando chicos no fue suficiente.
Todos conocemos muy bien el gran potencial de Lara...]]></description><link>https://millancore.com/laravel-illuminate-components-validation</link><guid isPermaLink="true">https://millancore.com/laravel-illuminate-components-validation</guid><category><![CDATA[Laravel]]></category><category><![CDATA[PHP]]></category><dc:creator><![CDATA[Juan Millan]]></dc:creator><pubDate>Wed, 20 Nov 2019 17:10:15 GMT</pubDate><content:encoded><![CDATA[<p>Algunas personas no podemos dormir sin saber como funcionan las cosas de fondo, nos puede la curiosidad y deseamos destapar todo, por que a lo mejor desarmar la radio cuando chicos no fue suficiente.</p>
<p>Todos conocemos muy bien el gran potencial de Laravel, pero se nos hace innecesariamente grande para algunos proyectos simples, librerias, sdks, etc, y aun así no queremos separarnos de aquello que Laravel hace muy bien.</p>
<p>En este capitulo veremos como usar el componente <strong>Validation</strong> de Laravel,  <a target='_blank' rel='noopener noreferrer'  href="https://github.com/illuminate/validation">illuminate/validation</a>, de manera individual.</p>
<p>Ya veremos que simple!</p>
<p>Lo primero que debemos hacer es instalarlo con composer</p>
<pre><code>composer <span class="hljs-built_in">require</span> illuminate/validation
</code></pre><p>Los ejemplos de este articulo se han creado con la versión 5.8</p>
<p>Vamos a crear un  ejemplo de validación simple en un solo archivo, ya queda en vuestra manos el mejorarlo,  llevarlo a facade o una clase que se encargue de las validaciones. </p>
<pre><code class="lang-php"><span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Filesystem</span>\<span class="hljs-title">Filesystem</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Translation</span>\<span class="hljs-title">FileLoader</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Translation</span>\<span class="hljs-title">Translator</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Validation</span>;

<span class="hljs-keyword">require_once</span> <span class="hljs-string">'vendor/autoload.php'</span>;

$fileLoader = <span class="hljs-keyword">new</span> FileLoader(<span class="hljs-keyword">new</span> Filesystem, <span class="hljs-string">'lang'</span>);

$validation = <span class="hljs-keyword">new</span> Validation\Factory(
    <span class="hljs-keyword">new</span> Translator($fileLoader, <span class="hljs-string">'en'</span>)
);
</code></pre>
<p>En las primeras lineas tenemos algunas dependencias de otros componentes <em>Filesystem</em>, <em>Translation</em> no hay nada de que preocuparse, ya vienen incluidas en la instalación del componente <strong>Validation</strong>.</p>
<p>Luego tenemos nuestro <strong>FileLoader</strong> que se encargara de cargar el archivo de las traducciones para las diferentes reglas de validación, al cual se le pasa una instancia de FileSystem y la ruta de nuestra carpeta con las traducciones <code>lang</code>, para simplificar mas las cosas la podemos copiar directamente desde laravel  <a target='_blank' rel='noopener noreferrer'  href="https://github.com/laravel/laravel/blob/master/resources/lang/en/validation.php">Validation Language Lines</a> siguiendo la misma estructura.</p>
<pre><code> <span class="hljs-selector-tag">-</span> <span class="hljs-selector-tag">lang</span>
    └─ <span class="hljs-selector-tag">en</span>
       └─ <span class="hljs-selector-tag">validation</span><span class="hljs-selector-class">.php</span>
</code></pre><p>Luego tenemos la creación de nuestro validador el cual espera una instancia de <em>Translation</em> al cual le pasamos nuestro FileLoader y el lenguaje local, en este caso &#39;en&#39;.</p>
<p>Listo ya tenemos nuestro validador!!</p>
<p>Ahora pongamos a prueba, haciendo uso de las reglas  <a target='_blank' rel='noopener noreferrer'  href="https://laravel.com/docs/6.x/validation#available-validation-rules">Validation Rules</a> </p>
<pre><code class="lang-php">$data = [ <span class="hljs-string">'email'</span> =&gt; <span class="hljs-string">'test@validation.com'</span>];

$rules = [
    <span class="hljs-string">'email'</span> =&gt; <span class="hljs-string">'required|email|max:55'</span>
];
</code></pre>
<p>Cuando tenemos la data que vamos a validar y las reglas podemos pasarlo por el validador.</p>
<pre><code class="lang-php">$validator = $validation-&gt;make($data, $rules);
</code></pre>
<p>Una vez en al validador podemos hacer uso de los diferentes métodos que tiene para manejar como mejor nos convenga los errores de validación.</p>
<p><code>$validator-&gt;validate()</code> Valida los datos pasados arrojando un <em>ValidationException</em> en caso de no pasar la validación.</p>
<p><code>$validator-&gt;fails()</code> Retorna true si los datos fallan la validación</p>
<p><code>$validator-&gt;errors()</code> Retorna un array con los mensajes de validación.</p>
<p>Espero os sea de ayuda!
Alguna duda o sugerencia la podéis dejarla como comentario o hacerme una mencion en twitter @millancore</p>
]]></content:encoded></item></channel></rss>