<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jilcimar Fernandes</title>
    <description>The latest articles on Forem by Jilcimar Fernandes (@jilcimar).</description>
    <link>https://forem.com/jilcimar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F286685%2Fb4d1ca18-355a-4b64-9aeb-b7757cd93150.jpeg</url>
      <title>Forem: Jilcimar Fernandes</title>
      <link>https://forem.com/jilcimar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jilcimar"/>
    <language>en</language>
    <item>
      <title>Performance no REDIS com Pipelining</title>
      <dc:creator>Jilcimar Fernandes</dc:creator>
      <pubDate>Tue, 23 May 2023 20:33:46 +0000</pubDate>
      <link>https://forem.com/jilcimar/performance-no-redis-com-pipelining-2ocg</link>
      <guid>https://forem.com/jilcimar/performance-no-redis-com-pipelining-2ocg</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Redis Pipelining?
&lt;/h2&gt;

&lt;p&gt;É uma técnica para melhorar o desempenho que permite enviar vários comandos de uma só vez sem esperar pela resposta de cada comando individual. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fonte: &lt;a href="https://redis.io/docs/manual/pipelining/" rel="noopener noreferrer"&gt;https://redis.io/docs/manual/pipelining/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Através dessa imagem é possível ver a diferença que o pipelining faz na execução: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7hwm9dhewdtkex7fiu3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7hwm9dhewdtkex7fiu3.png" alt="Performance do Redis com e sem o Pipelining" width="729" height="519"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fonte: &lt;a href="https://kn100.me/redis-pipelining/" rel="noopener noreferrer"&gt;https://kn100.me/redis-pipelining/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Quando ele é útil?
&lt;/h2&gt;

&lt;p&gt;O Pipeline é muito útil em situações em que há muitas operações de leitura/escrita no Redis. Ao usar um pipeline, é possível reduzir significativamente o custo de latência associado ao tempo de ida e volta, além disso, ele melhora muito o número de operações que você pode executar por segundo.&lt;/p&gt;

&lt;p&gt;Outro uso interessante para o Pipeline, é para implementar transações atômicas, garantindo que um conjunto de operações seja executado como uma única unidade. Isso é possível porque o Redis Pipeline permite que os comandos sejam agrupados em uma transação que só será executada quando todos os comandos no pipeline forem enviados e retornarem com sucesso.&lt;/p&gt;

&lt;h1&gt;
  
  
  Caso de uso
&lt;/h1&gt;

&lt;p&gt;No trabalho, passei por uma situação a qual precisava melhorar a performance de uma Lambda (Python) que consumia de uma fila SQS e em seguida realizava várias operações de leitura e escrita no REDIS. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PROBLEMA&lt;/strong&gt;&lt;br&gt;
Devido a quantidade de operações realizadas a cada mensagem recebida, algumas acabavam não sendo processadas devido o timeout de 30 segundos configurado na lambda. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw3o1rkke1phoicobf9c1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw3o1rkke1phoicobf9c1.png" alt="Gráfico de duração da Lambda" width="800" height="347"&gt;&lt;/a&gt;&lt;br&gt;
Gráfico de duração da execução (em milissegundos) da lambda antes de aplicar as técnicas de performance, chegando a picos de 27 segundos de duração: &lt;/p&gt;

&lt;p&gt;A fila a qual a lambda consumia as mensagens, recebia cargas com até 2.500 mensagens para processar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftps0ln9bwz81j4iltsz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftps0ln9bwz81j4iltsz2.png" alt="Dados da fila" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RESULTADOS APÓS PERFORMANCE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Após aplicar o Redis pipelining, alguns dos resultados que obtivemos na Lambda: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0a0ueyuoawz5sz70s1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0a0ueyuoawz5sz70s1t.png" alt="Desempenho da Lambda" width="800" height="346"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O maior pico de duração foi de 12,6 segundos. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;O resultado foi bem positivo, tendo em vista que na maioria dos casos chegaram a reduzir pela metade o tempo de duração, além disto, em cenários de processamento com o mesmo número de mensagem não tivemos mais nenhum caso de timeout. &lt;/p&gt;

&lt;p&gt;Após o uso do Redis Pipelining, também foram feitas algumas refatorações e mudanças na forma de processar a mensagem para melhorar ainda mais o tempo de execução da lambda.&lt;/p&gt;

</description>
      <category>redis</category>
      <category>performance</category>
      <category>backend</category>
      <category>database</category>
    </item>
    <item>
      <title>Calcular Frete dos Correios usando PHP 8.1</title>
      <dc:creator>Jilcimar Fernandes</dc:creator>
      <pubDate>Fri, 20 May 2022 13:01:42 +0000</pubDate>
      <link>https://forem.com/jilcimar/calcular-frete-dos-correios-usando-php-81-39f</link>
      <guid>https://forem.com/jilcimar/calcular-frete-dos-correios-usando-php-81-39f</guid>
      <description>&lt;p&gt;Este é um exemplo de classe em PHP para que você consiga simular os valores de frete. Após precisar realizar o cálculo de frete em um Checkout de Pagamento, vi que na internet os códigos que tinham para utilizar o serviço dos Correios eram antigos e a maioria não funcionava bem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="c1"&gt;//namespace ......;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FreightCalculate&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//41106 - PAC , 40010 - SEDEX&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$originZipCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$destinationZipCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$weight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//Min 10&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

         &lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'nCdEmpresa'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'sDsSenha'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'sCepOrigem'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;originZipCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'sCepDestino'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;destinationZipCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'nVlPeso'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//kg&lt;/span&gt;
            &lt;span class="s1"&gt;'nCdFormato'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;//1 para caixa / pacote e 2 para rolo/prisma.&lt;/span&gt;
            &lt;span class="s1"&gt;'nVlComprimento'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'nVlAltura'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'nVlLargura'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'nVlDiametro'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'sCdMaoPropria'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'n'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'nVlValorDeclarado'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'sCdAvisoRecebimento'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'n'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'StrRetorno'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'xml'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'nCdServico'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;http_build_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nv"&gt;$curl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'?'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nb"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$curl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$curl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;simplexml_load_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cServico&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nc"&gt;Erro&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'code'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nc"&gt;Codigo&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'value'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nc"&gt;Valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'deadline'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nc"&gt;PrazoEntrega&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'value'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getDeadline&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'deadline'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getCode&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'deadline'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta é a classe que você pode imnportar no seu projeto.&lt;/p&gt;

&lt;h1&gt;
  
  
  Como usar?
&lt;/h1&gt;

&lt;p&gt;Para usar basta instanciar a classe e chamar os métodos de acordo com a sua necessidade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$frete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FreightCalculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'41106'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'59945000'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'59158400'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="mf"&gt;...&lt;/span&gt;

 &lt;span class="nv"&gt;$frete&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="mf"&gt;...&lt;/span&gt;

&lt;span class="nv"&gt;$frete&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getDeadline&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>correios</category>
      <category>php</category>
      <category>api</category>
      <category>frete</category>
    </item>
    <item>
      <title>[TIP] - Laravel API Response Helpers</title>
      <dc:creator>Jilcimar Fernandes</dc:creator>
      <pubDate>Tue, 05 Oct 2021 15:17:44 +0000</pubDate>
      <link>https://forem.com/jilcimar/tip-laravel-api-response-helpers-b05</link>
      <guid>https://forem.com/jilcimar/tip-laravel-api-response-helpers-b05</guid>
      <description>&lt;p&gt;Este artigo é uma dica para quem já trabalhou com API REST no Laravel ou irá precisar trabalhar. O objetivo desse pacote é garantir respostas consistentes e padronizadas em toda sua aplicação Laravel. &lt;/p&gt;

&lt;p&gt;Quem já trabalhou em projetos legados ou até mesmo novos se forem mal escritos, provavelmente já se deparou com uma infinidade de métodos usados para retornar um erro ou mensagem de sucesso. Além disso, não é difícil de encontrar problemas de retornar o status code errado, como por exemplo uma mensagem de erro que retorna 200, como mostra na imagem abaixo: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu144jp2mmlw9dh0c2h2t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu144jp2mmlw9dh0c2h2t.png" alt="image" width="800" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Sobre o pacote
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy60qrcikkq3soupnbsvc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy60qrcikkq3soupnbsvc.png" alt="image" width="800" height="457"&gt;&lt;/a&gt;&lt;br&gt;
O pacote você pode encontrar a sua documentação nesse repositório &lt;a href="https://github.com/f9webltd/laravel-api-response-helpers" rel="noopener noreferrer"&gt;https://github.com/f9webltd/laravel-api-response-helpers&lt;/a&gt; , a proposta é de fato ser simples e garantir respostas consistentes da API no seu projeto Laravel. Para utilizar é preciso ter as seguintes especificações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP &lt;code&gt;^7.4 | ^8.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Laravel 6, 7 and 8&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Instalação
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;composer require f9webltd/laravel-api-response-helpers&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Exemplo de uso
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Http\Api\Controllers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;F9Web\ApiResponseHelpers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Http\JsonResponse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrdersController&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;ApiResponseHelpers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;JsonResponse&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;respondWithSuccess&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Alguns métodos disponíveis
&lt;/h1&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;respondNotFound(string|Exception $message, ?string $key = 'error')&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Retorna o código de status HTTP  &lt;code&gt;404&lt;/code&gt;, e opcionalmente pode receber um exceção personalizada. &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;respondWithSuccess(array|Arrayable|JsonSerializable|null $contents = [])&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Retorna o código de status HTTP  &lt;code&gt;200&lt;/code&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;respondUnAuthenticated(?string $message = null)&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Retorna o código de status HTTP  &lt;code&gt;401&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;respondForbidden(?string $message = null)&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Retorna o código de status HTTP  &lt;code&gt;403&lt;/code&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;respondError(?string $message = null)&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Retorna o código de status HTTP  &lt;code&gt;400&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;respondCreated(array|Arrayable|JsonSerializable|null $data = [])&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Retorna o código de status HTTP  &lt;code&gt;201&lt;/code&gt;, e como opcional você pode passar um &lt;code&gt;data&lt;/code&gt; que é devolvido na resposta. &lt;/p&gt;

&lt;p&gt;Esse são alguns métodos mas você pode conferir mais explorando a &lt;a href="https://github.com/f9webltd/laravel-api-response-helpers" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt; do pacote. &lt;/p&gt;

&lt;p&gt;E ai, curtiram a dica?&lt;/p&gt;

&lt;h1&gt;
  
  
  Fonte
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://laravel-news.com/laravel-api-response-helpers" rel="noopener noreferrer"&gt;https://laravel-news.com/laravel-api-response-helpers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/f9webltd/laravel-api-response-helpers" rel="noopener noreferrer"&gt;https://github.com/f9webltd/laravel-api-response-helpers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>laravel</category>
      <category>api</category>
      <category>helpers</category>
      <category>package</category>
    </item>
    <item>
      <title>O que é View Composer?</title>
      <dc:creator>Jilcimar Fernandes</dc:creator>
      <pubDate>Tue, 03 Aug 2021 14:33:22 +0000</pubDate>
      <link>https://forem.com/jilcimar/o-que-e-view-composer-n10</link>
      <guid>https://forem.com/jilcimar/o-que-e-view-composer-n10</guid>
      <description>&lt;p&gt;View Composer é uma solução elegante para um problema muito específico! Todo desenvolvedor provavelmente já se deparou com uma Exceção de variável indefinida ao chamar uma view. Isso é simples de resolver, foi você que esqueceu de buscar essa informação no seu controller para enviar. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F92z2lo6heckaeijdm5nu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F92z2lo6heckaeijdm5nu.png" alt="image" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usando o View Composer, não há mais essa necessidade de ficar se preocupando com os dados do seu arquivo de visualização, pois esse recurso irá garantir que todas as informações estarão lá sempre que a sua view seja renderizada.&lt;/p&gt;
&lt;h2&gt;
  
  
  View Composer na Prática
&lt;/h2&gt;

&lt;p&gt;Primeiro começo organizando o diretório de onde ficarão os arquivos que é em &lt;code&gt;app/Http/View/Composers&lt;/code&gt; é o que recomenda a &lt;a href="https://laravel.com/docs/8.x/views#view-composers" rel="noopener noreferrer"&gt;documentação do Laravel&lt;/a&gt; mas você pode ficar a vontade para modificar. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspppn1livetstsbslhpn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspppn1livetstsbslhpn.png" alt="image" width="304" height="221"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Classe de View Composer
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgc057mthd9b101p1f0eg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgc057mthd9b101p1f0eg.png" alt="image" width="800" height="776"&gt;&lt;/a&gt;&lt;br&gt;
Dentro dessa classe você pode usar quaquer dependência que precise. Nesse exemplo estou dizendo para o framework que a variável &lt;code&gt;users&lt;/code&gt; irá receber o valor dessa consulta &lt;code&gt;User::with('role')-&amp;gt;withTrashed()-&amp;gt;paginate(10)&lt;/code&gt; . Todas as definições de variáveis ficarão nessa função &lt;code&gt;compose&lt;/code&gt;. &lt;/p&gt;
&lt;h3&gt;
  
  
  Criando um Service Provider
&lt;/h3&gt;

&lt;p&gt;Para registrar os seus View Composers, iremos precisar &lt;a href="https://laravel.com/docs/8.x/providers" rel="noopener noreferrer"&gt;criar um Service Providers&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6i0dycy4wavvaa2cie3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6i0dycy4wavvaa2cie3.png" alt="image" width="800" height="924"&gt;&lt;/a&gt;&lt;br&gt;
Esse é um exemplo do meu &lt;code&gt;ViewServiceProvider&lt;/code&gt;. Observe que no método &lt;code&gt;register&lt;/code&gt;eu especifico o diretório de onde os meus arquivos de visualização estão localizados. Não esqueça de registrar o seu Service Provider no array de &lt;code&gt;'providers'&lt;/code&gt; em   &lt;code&gt;config/app.php&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Veja que no &lt;code&gt;registerComposers&lt;/code&gt; é onde defino exatamente os arquivos que aquele View Composer que acabamos de criar irá aparecer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;View::composer([
            'users.index',
            'users.create',
            'users.edit',
        ], UserViewComposer::class);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse trecho estou informando que toda as variáveis definidas no &lt;code&gt;UserViewComposer&lt;/code&gt; irão aparecer sempre que forem renderizadas as views de &lt;code&gt;index&lt;/code&gt;,&lt;code&gt;create&lt;/code&gt; e &lt;code&gt;edit&lt;/code&gt; do usuário. &lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; O primeiro ponto que destaco é organização, pois todas as variáveis e dados serão tratados em um arquivo específico do seu projeto.  &lt;/li&gt;
&lt;li&gt; Outro benefício é a "limpeza" que você irá causar nos seus controllers, pois não há necessidade de ficar passando dados por ele&lt;/li&gt;
&lt;li&gt;Gatantia que sempre uma view for renderizada, todos os dados que ela precisa estarão disponíveis&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;É isso galera, espero que tenham gostado desse recurso  que ajuda muito a organizar o seu projeto e também melhorar a manutenção do código. Gostou? deixa um comentário ai 😃 .&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>backend</category>
      <category>codequality</category>
    </item>
    <item>
      <title>GIT-FLOW: UMA ESTRATÉGIA PARA ADAPTAR DE ACORDO COM O PROCESSO DO SEU TIME</title>
      <dc:creator>Jilcimar Fernandes</dc:creator>
      <pubDate>Wed, 16 Jun 2021 18:22:40 +0000</pubDate>
      <link>https://forem.com/jilcimar/git-flow-uma-estrategia-de-sucesso-para-adaptar-ao-processo-do-seu-time-1bah</link>
      <guid>https://forem.com/jilcimar/git-flow-uma-estrategia-de-sucesso-para-adaptar-ao-processo-do-seu-time-1bah</guid>
      <description>&lt;h1&gt;
  
  
  💡 O que é o Git-Flow?
&lt;/h1&gt;

&lt;p&gt;Ao trabalhar em equipe, é necessário definir convenções ou boas práticas para que todos saibam trabalhar juntos. O Git-Flow é um dos muitos chamados workflows, bastante popular por sua praticidade e aprendizado relativamente rápido. É uma forma de organizar as branches do seu repositório. Só pegar o Git-Flow e aplica-lo talvez não atenda a necessidade da sua equipe, principalmente pensando na maioria das empresas que possuem setores de Quality Assurance (QA) e esse workflow não leva em consideração. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OBS.: Não irei me atentar em ficar citando os comandos do Git-Flow, o foco neste artigo é outro e você pode consultar esses comandos acessando a &lt;a href="https://danielkummer.github.io/git-flow-cheatsheet/index.pt_BR.html" rel="noopener noreferrer"&gt;Documentação&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  ⭐ Motivação
&lt;/h1&gt;

&lt;p&gt;Usando essa estratégia, o objetivo é: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redução de conflitos, pois o git flow irá ficar responsável por criar e fechar a branch de desenvolvimento no local correto (de forma automática)&lt;/li&gt;
&lt;li&gt;Padronização do nome de branchs, já que o git flow coloca prefixos automáticos como “feature/nome-da-branch” ou “hotfix/nome-da-branch”&lt;/li&gt;
&lt;li&gt;Segurança no processo de desenvolvimento

&lt;ul&gt;
&lt;li&gt;Só sobe o que está OK pelo QA&lt;/li&gt;
&lt;li&gt;Possibilidade de voltar a produção com base na versão desejada&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Versionamento do sistema através das tags&lt;/li&gt;

&lt;li&gt;Todos os desenvolvedores alinhados com o processo&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Organização
&lt;/h1&gt;

&lt;p&gt;Se você pesquisou por "Git Flow" certamente deve ter se deparado com uma imagem parecida com essa: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xwqxp14q6uvf17xrxuj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xwqxp14q6uvf17xrxuj.png" alt="image" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa é a base do Git-Flow e já atende quase todo o fluxo de desenvolvimento, a única adaptação que iremos fazer é inserir o processo de Code Review e o QA que não são contemplados nesse flow. &lt;/p&gt;
&lt;h1&gt;
  
  
  Adaptação
&lt;/h1&gt;

&lt;p&gt;Então, como já foi dito irei propor um modelo que engloba o Code Review e também os ambientes de teste (QA). A modificação no fluxo fica assim:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgnbwi9s5i8s6y4zx0ur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgnbwi9s5i8s6y4zx0ur.png" alt="Alt Text" width="800" height="356"&gt;&lt;/a&gt;&lt;br&gt;
Veja que entrou uma nova camada entre as &lt;em&gt;feature&lt;/em&gt; e &lt;em&gt;develop&lt;/em&gt;. O que significa que antes de ser dado um "finish" na &lt;em&gt;feature&lt;/em&gt;, a branch deve passar pelo processo de Code Review e em seguida ir para o QA validar. Se tudo ocorrer bem a ramificação é integrada na &lt;em&gt;develop&lt;/em&gt; ao executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git flow feature finish nome_da_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Develop
&lt;/h2&gt;

&lt;p&gt;Outro ponto que podemos observar é que a develop além de ser um "espelho" da "master" em alguns momentos, ela sempre irá conter as features finalizadas (foram testadas pelo QA e validadas). &lt;/p&gt;

&lt;h2&gt;
  
  
  Segurança
&lt;/h2&gt;

&lt;p&gt;Essas camadas do Git-Flow adicionam mais segurança na subida das novas funcionalidades do seu software, já que para um desenvolvimento chegar em produção (branch master) ele precisa passar pela camada de teste (QA) e em seguida develop. A partir desse ponto é que o desenvolvimento pode ser disponibilizado caso seja criada uma &lt;em&gt;release&lt;/em&gt;. &lt;/p&gt;

&lt;h1&gt;
  
  
  Como aplicar a metodologia a minha equipe ?
&lt;/h1&gt;

&lt;p&gt;O processo pode ser que não se adeque totalmente a realidade do seu time, porém, pode adapta-lo para que chegue em um modelo que atende a necessidade do projeto. &lt;/p&gt;

&lt;p&gt;Como dica eu sugiro começar por um repositório e em seguida ir aplicando nos demais (se na sua equipe trabalha em mais de um projeto). &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OBS: Processo bom é aquele que resolve o problema do seu trabalho, se a sua equipe já funciona bem com uma metodologia diferente eu não vejo motivos para mudar. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É isso galera, espero ter ajudado vocês falando em uma perspectiva diferente sobre o Git-Flow, pois a maioria dos artigos que vejo são focados no uso da ferramenta (como executar os comandos) e não se atentando a estrutura e organização. &lt;/p&gt;

</description>
      <category>git</category>
      <category>flow</category>
      <category>software</category>
      <category>process</category>
    </item>
    <item>
      <title>[Tips &amp; Tricks] Laravel Clean Code</title>
      <dc:creator>Jilcimar Fernandes</dc:creator>
      <pubDate>Mon, 24 May 2021 22:52:33 +0000</pubDate>
      <link>https://forem.com/jilcimar/tips-tricks-laravel-clean-code-1mc4</link>
      <guid>https://forem.com/jilcimar/tips-tricks-laravel-clean-code-1mc4</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fas7ripqed3k9tqi639i6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fas7ripqed3k9tqi639i6.jpg" alt="Alt Text" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E ai galera, neste artigo como o próprio título já fala, pretendo reunir algumas dicas para construirmos códigos mais limpos no Laravel. Todo bom desenvolvedor sabe o quanto é essencial termos um código "enxuto" e limpo, além de facilitar o entendimento ajuda os próximos devs que venham a pegar o seu código para manutenção. &lt;/p&gt;

&lt;p&gt;Nem todos os passos aqui contidos devem ser estritamente seguidos e menos ainda se tornarão regras absolutas. Estas são dicas e nada mais, mas são coisas que aprendi ao longo da minha experiência trabalhando em equipe e a partir do que leio pelos autores de "Código Limpo".&lt;/p&gt;

&lt;h2&gt;
  
  
  1- Uso de Traits
&lt;/h2&gt;

&lt;p&gt;As Traits servem simplesmente para reuso de código, que pode nos auxiliar nos casos em que fatalmente precisamos cair no comportamento de “copiar e colar” determinados trechos de códigos em diferentes classes. Dessa forma, a primeira dica é criarmos traits para nossos relacionamentos, assim podemos aproveitar eles em diferentes Models. &lt;/p&gt;

&lt;p&gt;Eu gosto de criar elas em &lt;em&gt;&lt;strong&gt;Models/Relations&lt;/strong&gt;&lt;/em&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5nmgdc8zk4vil5fv5zm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5nmgdc8zk4vil5fv5zm.png" alt="image" width="309" height="110"&gt;&lt;/a&gt;&lt;br&gt;
Este é um exemplo de uma trait para o relacionamento &lt;strong&gt;BelongsToUser&lt;/strong&gt;: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbtq1f6ubsq7bexxg2oe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbtq1f6ubsq7bexxg2oe.png" alt="image" width="800" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No exemplo, os models de &lt;strong&gt;Address&lt;/strong&gt; e &lt;strong&gt;Point&lt;/strong&gt; &lt;strong&gt;possuem o mesmo relacionamento com o model de User&lt;/strong&gt;, é feito apenas a chamada da trait &lt;strong&gt;BelongsToUser&lt;/strong&gt; no início da classe sem precisar ficar reescrevendo o código do relacionamento: &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2q86o0m1pfwx3of0nme.png" width="800" height="731"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft60r0b3mky11ljtn3f9k.png" width="800" height="731"&gt;&lt;/td&gt;
  &lt;/tr&gt;
 &lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  2 - View Composer
&lt;/h2&gt;

&lt;p&gt;Um recurso muito bacana do framework que gosto de utilizar é o uso de View Composer, nele simplesmente centralizamos as variáveis de cada view quando ela é renderizada sem precisar ficar passando os parâmetros pelo controller. Então, independente do lugar que chame aquela view, você não precisa ficar se preocupando com as variáveis que ela precisa receber. Veja o exemplo do meu &lt;strong&gt;UserViewComposer&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzus7annjx5fj1hja7mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzus7annjx5fj1hja7mn.png" alt="image" width="800" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu tenho um ServiceProvider chamado &lt;strong&gt;ViewServiceProvider&lt;/strong&gt; que é onde define em quais views aquelas variáveis (roles e users) devem aparecer quando forem renderizadas. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgnlyrvv5hx85booyuycu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgnlyrvv5hx85booyuycu.png" alt="image" width="800" height="955"&gt;&lt;/a&gt;&lt;br&gt;
Veja que sempre que forem chamada as views: &lt;em&gt;'pages.users.index', 'pages.users.create' e 'pages.users.edit'&lt;/em&gt; essas variáveis definidas no &lt;strong&gt;UserViewComposer&lt;/strong&gt; estarão disponíveis, assim não precisamos nos preocupar em ficar passando elas pelo o controller! Sem falar que ocorre das vezes acabamos esquecendo de alguma 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  3 - Separe a regra de negócio
&lt;/h2&gt;

&lt;p&gt;Crie métodos no seu model para isolar a lógica de negócio. Seus controladores devem ser simples. Eles precisam dizer coisas como "criar fatura do pedido". Eles não devem se preocupar com os detalhes de como seu banco de dados está estruturado. Deixe isso para o modelo.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt; &lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faagedp7ezeapp6kv6szs.png" width="800" height="479"&gt;
&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzc30096ctr48sbnhcnp2.png" width="704" height="408"&gt;&lt;/td&gt;
  &lt;/tr&gt;
 &lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4 - Form's Request's
&lt;/h2&gt;

&lt;p&gt;Ao invés de usar o validate dentro do seu controler, escolha os Requests, porque além de isolar toda a lógica de validação do seu backend, ainda deixa o controller mais limpo. Veja um exemplo da validação com e sem o uso de Form Request. &lt;/p&gt;

&lt;h3&gt;
  
  
  Sem Form Request ❌
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsoxxyclyizu1civezz2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsoxxyclyizu1civezz2l.png" alt="image" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Com Form Request ✅
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtf02z3uglt3zhiq5qdg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtf02z3uglt3zhiq5qdg.png" alt="image" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bem mais limpo né? Além disso, você pode até re-aproveitar a chamada das regras de validação e também fazer um esquema de "permissão" no authorize. Se curtiu essa dica, você pode da uma olhada na documentação oficial de como utilizar o &lt;a href="https://laravel.com/docs/8.x/validation#form-request-validation" rel="noopener noreferrer"&gt;Form Request&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5 - Uso de Helper Functions
&lt;/h2&gt;

&lt;p&gt;Se existem trechos de códigos que estão repetidos, outro recurso que você pode utilizar são os helpers.É muito comum usarmos para formatação e conversão de texto, por exemplo. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpl2gzz8mrjcox343m20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpl2gzz8mrjcox343m20.png" alt="image" width="800" height="269"&gt;&lt;/a&gt;&lt;br&gt;
A função "money" agora pode ser chamada em qualquer parte do projeto. &lt;/p&gt;

&lt;p&gt;E aí, você já sabia de todas? Essas foram só algumas sugestões que se aplicarmos no nosso dia a dia podem fazer muita diferença! Espero que tenham gostado, deixem mais dicas nos comentários 😃&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>clean</category>
      <category>php</category>
      <category>backend</category>
    </item>
    <item>
      <title>Criando um servidor de homologação para aplicações Laravel usando o Heroku</title>
      <dc:creator>Jilcimar Fernandes</dc:creator>
      <pubDate>Mon, 01 Jun 2020 22:03:16 +0000</pubDate>
      <link>https://forem.com/jilcimar/criando-um-servidor-de-homologacao-para-aplicacoes-laravel-usando-o-heroku-1cd0</link>
      <guid>https://forem.com/jilcimar/criando-um-servidor-de-homologacao-para-aplicacoes-laravel-usando-o-heroku-1cd0</guid>
      <description>&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FLZz77hF%2F1-jr-Vi4-Zt-H-Ld-SUj-BS8j-BWvg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FLZz77hF%2F1-jr-Vi4-Zt-H-Ld-SUj-BS8j-BWvg.jpg" alt="Heroku + Laravel + Github" width="700" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Muita das vezes precisamos testar nossas aplicações em um servidor antes de lançarmos em produção, mas nem todos tem familiaridade com deploy ou possuem um servidor de homologação (testes). Dessa forma, o Heroku pode se tornar uma alternativa, pois é fácil de usar (abstrai muita coisa) e o melhor de tudo, é free! 🎉 &lt;/p&gt;

&lt;p&gt;Este artigo é para mostrar o passo a passo de como podemos publicar nossos projetos em Laravel utilizando o Heroku e criar um servidor de homologação simples com deploy automatizado usando o &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;Github&lt;/a&gt;. Se você não conhece o Heroku, pode saber mais sobre ele clicando &lt;a href="https://www.heroku.com/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Instalando o Heroku
&lt;/h2&gt;

&lt;p&gt;Para esse tutorial vou partir da premissa que você já está com o seu projeto no GitHub e com uma conta criada no Heroku (só acessar &lt;a href="https://www.heroku.com/" rel="noopener noreferrer"&gt;https://www.heroku.com&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FTrTc7dy%2Fdash-heroku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FTrTc7dy%2Fdash-heroku.png" alt="Heroku DashBoard" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois da conta criada, você pode instalar o Heroku CLI acessando &lt;a href="https://devcenter.heroku.com/articles/heroku-cli" rel="noopener noreferrer"&gt;https://devcenter.heroku.com/articles/heroku-cli&lt;/a&gt; . &lt;br&gt;
No meu caso que uso Linux, instalei via npm rodando o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install -g heroku&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Se foi instalado com sucesso você irar conseguir ver a versão rodando o comando:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;heroku -v&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando o Heroku
&lt;/h2&gt;

&lt;p&gt;Dentro da raiz da sua aplicação Laravel, vamos criar um arquivo chamado "Procfile" (conforme a figura abaixo), nele vamos informar o "perfil" do nosso servidor, que no meu caso vai ser o apache2 (Mas você pode usar o nginx por exemplo). &lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F1vKfbm5%2Fcreate-file-terminal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F1vKfbm5%2Fcreate-file-terminal.png" alt="Create File Procfile" width="651" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No arquivo vamos escrever a seguinte linha:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;web: vendor/bin/heroku-php-apache2 public/&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando um novo app no Heroku
&lt;/h3&gt;

&lt;p&gt;Agora vamos criar um app no Heroku rodando o seguinte comando:&lt;br&gt;
&lt;br&gt;
  &lt;code&gt;heroku create&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FJjNSQTp%2Fheroku-create.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FJjNSQTp%2Fheroku-create.png" alt="Create File Procfile" width="764" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você deve ter um resultado parecido com a imagem acima. &lt;/p&gt;

&lt;p&gt;Se você acessar &lt;a href="https://dashboard.heroku.com/apps" rel="noopener noreferrer"&gt;https://dashboard.heroku.com/apps&lt;/a&gt; irá ver que a aplicação que acabamos de criar está listada. 🙌&lt;/p&gt;
&lt;h3&gt;
  
  
  Subindo o projeto para o servidor
&lt;/h3&gt;

&lt;p&gt;Antes vamos configurar um script para quando subirmos a nossa aplicação ele dar a permissão na pasta &lt;code&gt;public/&lt;/code&gt; , em seu  &lt;code&gt;composer.json&lt;/code&gt; na sessão de scripts adicione o seguinte trecho:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"post-install-cmd": [&lt;br&gt;
     "php artisan clear-compiled",&lt;br&gt;
     "chmod -R 775 public/"&lt;br&gt;
 ]&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Se você rodar o comando&lt;br&gt;
&lt;br&gt;
  &lt;code&gt;git remote -v&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
 irá ver que foi criado um novo remote além do &lt;code&gt;origin&lt;/code&gt; com o nome &lt;code&gt;heroku&lt;/code&gt;, é ele que iremos utilizar para dar push em nosso código para disponibilizar no servidor com:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git push heroku master&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Pela aba "Overview" em seu dashboard do Heroku, irá ver que sua aplicação já está disponível: &lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FjfqdQsB%2Fheroku-on.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FjfqdQsB%2Fheroku-on.png" alt="Aplicação Disponível" width="623" height="235"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Configurando as variáveis do .env
&lt;/h3&gt;

&lt;p&gt;Para configurar as variáveis do nosso .env, é só acessar a aba "Settings" e ir até  "Config Vars". Adicione a KEY e o valor correspondente conforme a imagem:&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FKK37NJk%2Fenv-heroku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FKK37NJk%2Fenv-heroku.png" alt="Variáveis no Heroku" width="800" height="142"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Criando o banco de dados
&lt;/h3&gt;

&lt;p&gt;Pelo dashboard só que agora na aba &lt;code&gt;Resources&lt;/code&gt; em &lt;code&gt;Add-ons&lt;/code&gt; pesquise por &lt;code&gt;postgres&lt;/code&gt; (você pode escolher o banco de sua preferência) e selecione o Heroku Postgres: &lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F0XbcsHM%2Fpostgres.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F0XbcsHM%2Fpostgres.png" alt="Banco no Heroku" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecione o plano &lt;code&gt;Hobby Dev - Free&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora, no terminal de sua aplicação vamos obter as credenciais do Banco de Dados que acabamos de criar executando:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;heroku pg:credentials:url&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Será exibida as credencias para conectar ao banco, o próximo passo é adicionar elas assim como fizemos para as demais do &lt;code&gt;.env&lt;/code&gt; como já foi exemplificado. &lt;/p&gt;

&lt;p&gt;Agora podemos rodar nossas &lt;code&gt;migrations&lt;/code&gt; e &lt;code&gt;seeders&lt;/code&gt; executando:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;heroku run php artisan migrate --seed&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando o Deploy automático a partir da master
&lt;/h2&gt;

&lt;p&gt;Com nossa aplicação rodando e tudo funcionando, vamos configurar para que sempre que houver alteração na branch &lt;code&gt;master&lt;/code&gt; o Heroku faça o deploy automático. &lt;/p&gt;

&lt;p&gt;Esse passo é bem simples, na aba de &lt;code&gt;deploy&lt;/code&gt; vamos selecionar o &lt;code&gt;Deployment method&lt;/code&gt; GitHub. Irá pedir para você fazer a autenticação na sua conta e em seguida selecionar o repositório. Pronto, só isso e está tudo configurado para o nosso servidor de testes atualizar sozinho quando a &lt;code&gt;master&lt;/code&gt; sofrer alterações. &lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FJHKg7wd%2Fdeployautomatic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FJHKg7wd%2Fdeployautomatic.png" alt="Create File Procfile" width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso queira desabilitar essa opção para fazer o deploy de forma manual como fizemos na primeira vez para subir o código, na mesma sessão em &lt;code&gt;App connected to GitHub&lt;/code&gt; clique em &lt;code&gt;disconnect&lt;/code&gt;. &lt;/p&gt;

</description>
      <category>laravel</category>
      <category>github</category>
      <category>heroku</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
