<?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: slns</title>
    <description>The latest articles on Forem by slns (@slns).</description>
    <link>https://forem.com/slns</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%2F548307%2F10f7f982-a2d2-454c-8bbf-e3f5d6357c80.png</url>
      <title>Forem: slns</title>
      <link>https://forem.com/slns</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/slns"/>
    <language>en</language>
    <item>
      <title>🦀 Rust's Type System: Forte, estático e à prova de erros/Strong, Static, and Built for Safety</title>
      <dc:creator>slns</dc:creator>
      <pubDate>Mon, 21 Apr 2025 12:00:00 +0000</pubDate>
      <link>https://forem.com/slns/rusts-type-system-forte-estatico-e-a-prova-de-errosstrong-static-and-built-for-safety-1cjd</link>
      <guid>https://forem.com/slns/rusts-type-system-forte-estatico-e-a-prova-de-errosstrong-static-and-built-for-safety-1cjd</guid>
      <description>&lt;p&gt;Se Ownership, Borrowing e Lifetimes são os pilares da segurança em Rust, então o &lt;strong&gt;sistema de tipos forte e estático&lt;/strong&gt; é o alicerce que sustenta a robustez e a eficiência do código.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é o sistema de tipos de Rust?
&lt;/h3&gt;

&lt;p&gt;Rust possui um sistema de tipos &lt;strong&gt;forte e estático&lt;/strong&gt;, o que significa que os tipos de dados são verificados em tempo de compilação e não podem ser alterados durante a execução. Isso garante que erros de tipo sejam detectados cedo, antes mesmo de o programa ser executado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Tipo explícito: i32 (inteiro de 32 bits)&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Rust"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Tipo explícito: &amp;amp;str (string imutável)&lt;/span&gt;

    &lt;span class="c1"&gt;// Erro: não é possível somar um inteiro e uma string&lt;/span&gt;
    &lt;span class="c1"&gt;// let resultado = numero + texto; // O compilador impede isto&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Como funciona?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tipos explícitos&lt;/strong&gt;: Em Rust, os tipos podem ser declarados explicitamente, mas muitas vezes o compilador pode inferir os tipos automaticamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verificação em tempo de compilação&lt;/strong&gt;: O compilador verifica se as operações entre tipos são válidas, evitando erros como somar um número com uma string.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sem conversões implícitas&lt;/strong&gt;: Rust não permite conversões automáticas entre tipos incompatíveis. Se precisar converter um tipo para outro, deve ser feito de forma explícita.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;outro_numero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Tipo explícito: f64 (número de ponto flutuante)&lt;/span&gt;

    &lt;span class="c1"&gt;// Conversão explícita&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;outro_numero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 'as' é usado para conversão&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Soma: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;soma&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;h4&gt;
  
  
  O que não se pode fazer?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Não é possível ignorar os tipos ou forçar conversões inválidas&lt;/strong&gt;. O compilador de Rust é rigoroso e impede operações que não fazem sentido, como somar um número com uma string ou converter tipos incompatíveis sem uma conversão explícita.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Rust"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Erro: tipos incompatíveis&lt;/span&gt;
    &lt;span class="c1"&gt;// let resultado = numero + texto; // O compilador impede isto&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Porque é que isto é importante?
&lt;/h4&gt;

&lt;p&gt;O sistema de tipos forte e estático permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Detectar erros cedo, durante a compilação, em vez de em tempo de execução&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Código mais seguro e previsível, sem surpresas causadas por conversões implícitas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Melhor desempenho, pois o compilador pode otimizar o código com base nos tipos conhecidos&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust obriga a pensar &lt;strong&gt;nos tipos de dados desde o início&lt;/strong&gt; — e embora pareça exigente, isso resulta em código mais robusto, eficiente e livre de erros.&lt;/p&gt;







&lt;p&gt;If Ownership, Borrowing, and Lifetimes are the pillars of safety in Rust, then the &lt;strong&gt;strong and static type system&lt;/strong&gt; is the foundation that supports the robustness and efficiency of the code.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Rust's type system?
&lt;/h3&gt;

&lt;p&gt;Rust has a &lt;strong&gt;strong and static&lt;/strong&gt; type system, which means that data types are checked at compile time and cannot be changed during execution. This ensures that type errors are detected early, before the program is even run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Explicit type: i32 (32-bit integer)&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Rust"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Explicit type: &amp;amp;str (immutable string)&lt;/span&gt;

    &lt;span class="c1"&gt;// Error: cannot add an integer and a string&lt;/span&gt;
    &lt;span class="c1"&gt;// let resultado = numero + texto; // The compiler prevents this&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Explicit types&lt;/strong&gt;: In Rust, types can be declared explicitly, but often the compiler can infer types automatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compile-time verification&lt;/strong&gt;: The compiler checks if operations between types are valid, avoiding errors like adding a number to a string.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No implicit conversions&lt;/strong&gt;: Rust does not allow automatic conversions between incompatible types. If you need to convert one type to another, it must be done explicitly.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;outro_numero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Explicit type: f64 (floating-point number)&lt;/span&gt;

    &lt;span class="c1"&gt;// Explicit conversion&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;outro_numero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 'as' is used for conversion&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Soma: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;soma&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;h4&gt;
  
  
  What can't you do?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;You cannot ignore types or force invalid conversions&lt;/strong&gt;. Rust's compiler is strict and prevents operations that don't make sense, such as adding a number to a string or converting incompatible types without an explicit conversion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Rust"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Error: incompatible types&lt;/span&gt;
    &lt;span class="c1"&gt;// let resultado = numero + texto; // The compiler prevents this&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Why is this important?
&lt;/h4&gt;

&lt;p&gt;The strong and static type system allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Detecting errors early, during compilation, rather than at runtime&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Safer and more predictable code, without surprises caused by implicit conversions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Better performance, as the compiler can optimize the code based on known types&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust forces you to think about &lt;strong&gt;data types from the start&lt;/strong&gt; — and although it may seem demanding, this results in more robust, efficient, and error-free code.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>typesystem</category>
    </item>
    <item>
      <title>🦀 Lifetimes - Rust: Garante que a memória vive o tempo certo!/Make Sure Memory Lives Just Long Enough!</title>
      <dc:creator>slns</dc:creator>
      <pubDate>Sun, 20 Apr 2025 12:00:00 +0000</pubDate>
      <link>https://forem.com/slns/lifetimes-rust-garante-que-a-memoria-vive-o-tempo-certomake-sure-memory-lives-just-long-57bo</link>
      <guid>https://forem.com/slns/lifetimes-rust-garante-que-a-memoria-vive-o-tempo-certomake-sure-memory-lives-just-long-57bo</guid>
      <description>&lt;p&gt;Se Ownership é o coração de Rust e Borrowing é o cérebro, então Lifetime é o sistema nervoso que garante que tudo funcione em harmonia.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é Lifetime?
&lt;/h3&gt;

&lt;p&gt;Em Rust, o &lt;strong&gt;tempo de vida&lt;/strong&gt; (lifetime) é uma forma de garantir que as referências sejam válidas durante todo o período em que são usadas. Ele assegura que uma referência nunca aponta para um valor que já foi destruído, evitando erros como acessos a memória inválida.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rust"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// 'nome' é válido aqui&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;saudacao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 'saudacao' empresta 'nome'&lt;/span&gt;
        &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;saudacao&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// 'saudacao' é válido apenas dentro deste bloco&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// 'saudacao' não é mais válido aqui, mas 'nome' ainda é&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Como funciona?
&lt;/h3&gt;

&lt;p&gt;O compilador de Rust analisa o código para garantir que as referências não sobrevivam aos valores aos quais estão associadas. Isso é feito através de &lt;strong&gt;anotações de tempo de vida&lt;/strong&gt;, que explicitam as relações entre referências.&lt;/p&gt;

&lt;p&gt;Vamos analisar um exemplo mais detalhado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;funcao&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="c1"&gt;// Retorna uma referência com o mesmo tempo de vida dos parâmetros&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explicação detalhada:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Definição da função com lifetime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;fn funcao&amp;lt;'a&amp;gt;(...)&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parâmetros da função&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;x: &amp;amp;'a i32, y: &amp;amp;'a i32&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tipo de retorno da função&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;-&amp;gt; &amp;amp;'a i32&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Corpo da função&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;x // Retorna uma referência com o mesmo tempo de vida dos parâmetros&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  O que não se pode fazer?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Não se pode retornar uma referência que vive mais tempo do que o valor original&lt;/strong&gt;. Isso evita que o programa acesse memória que já foi libertada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;erro&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 'x' é criado aqui&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="c1"&gt;// Erro! 'x' é destruído no final da função, mas a referência tenta viver mais tempo&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Porque é que isto é importante?
&lt;/h3&gt;

&lt;p&gt;O sistema de Lifetime permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Garantir a segurança das referências sem necessidade de garbage collection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evitar bugs como acessos a memória inválida ou referências pendentes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Código mais robusto e previsível&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust obriga a pensar &lt;strong&gt;quanto tempo os dados são válidos&lt;/strong&gt; — e embora pareça complexo no início, dá muito mais confiança e controle sobre o comportamento do programa.&lt;/p&gt;







&lt;p&gt;If Ownership is the heart of Rust and Borrowing is the brain, then Lifetime is the nervous system that ensures everything works in harmony.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Lifetime?
&lt;/h3&gt;

&lt;p&gt;In Rust, the &lt;strong&gt;lifetime&lt;/strong&gt; is a way to ensure that references are valid throughout the period they are used. It ensures that a reference never points to a value that has already been destroyed, avoiding errors like invalid memory access.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rust"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// 'nome' is valid here&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;saudacao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 'saudacao' borrows 'nome'&lt;/span&gt;
        &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;saudacao&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// 'saudacao' is valid only within this block&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// 'saudacao' is no longer valid here, but 'nome' still is&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;p&gt;The Rust compiler analyzes the code to ensure that references do not outlive the values they are associated with. This is done through &lt;strong&gt;lifetime annotations&lt;/strong&gt;, which explicitly define the relationships between references.&lt;/p&gt;

&lt;p&gt;Let's analyze a more detailed example:&lt;/p&gt;

&lt;p&gt;fn funcao&amp;lt;'a&amp;gt;(x: &amp;amp;'a i32, y: &amp;amp;'a i32) -&amp;gt; &amp;amp;'a i32 {&lt;br&gt;
    x // Returns a reference with the same lifetime as the parameters&lt;br&gt;
}&lt;/p&gt;
&lt;h4&gt;
  
  
  Detailed explanation:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Function definition with lifetime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;fn funcao&amp;lt;'a&amp;gt;(...)&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Function parameters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;x: &amp;amp;'a i32, y: &amp;amp;'a i32&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Function return type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;-&amp;gt; &amp;amp;'a i32&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Function body&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;x // Returns a reference with the same lifetime as the parameters&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  What can't you do?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;You cannot return a reference that lives longer than the original value&lt;/strong&gt;. This prevents the program from accessing memory that has already been freed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;erro&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 'x' is created here&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="c1"&gt;// Error! 'x' is destroyed at the end of the function, but the reference tries to live longer&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Why is this important?
&lt;/h4&gt;

&lt;p&gt;The Lifetime system allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ensuring the safety of references without the need for garbage collection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoiding bugs like invalid memory access or dangling references&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More robust and predictable code&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust forces you to think about &lt;strong&gt;how long the data is valid&lt;/strong&gt; — and although it may seem complex at first, it gives you much more confidence and control over the behavior of the program.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🦀 Borrowing - Rust: Utilizar sem perder a posse./Access with Ownership Intact</title>
      <dc:creator>slns</dc:creator>
      <pubDate>Sat, 19 Apr 2025 12:00:00 +0000</pubDate>
      <link>https://forem.com/slns/borrowing-rust-utilizar-sem-perder-a-posseaccess-with-ownership-intact-5891</link>
      <guid>https://forem.com/slns/borrowing-rust-utilizar-sem-perder-a-posseaccess-with-ownership-intact-5891</guid>
      <description>&lt;p&gt;Se o &lt;strong&gt;Ownership&lt;/strong&gt; é o coração de Rust, o &lt;strong&gt;Borrowing&lt;/strong&gt; é o cérebro que permite trabalhar com dados sem perder a segurança.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Borrowing?
&lt;/h2&gt;

&lt;p&gt;Em Rust, &lt;strong&gt;emprestar&lt;/strong&gt; um valor significa usá-lo temporariamente sem tomar a sua posse. Isso permite que múltiplas partes do código acessem os mesmos dados, mas &lt;strong&gt;sem risco de acessos inválidos ou modificações inesperadas&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rust"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Empresta 'nome' para a função, sem transferir a posse&lt;/span&gt;
    &lt;span class="nf"&gt;saudacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 'nome' ainda é válido aqui&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;saudacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, {}!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&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;h3&gt;
  
  
  Tipos de Empréstimos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&amp;amp;T (Empréstimo Imutável)&lt;/strong&gt;: Permite ler o valor, mas não modificá-lo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;amp;mut T (Empréstimo Mutável)&lt;/strong&gt;: Permite ler e modificar o valor, mas só pode existir um empréstimo mutável por vez.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// Empréstimo imutável&lt;/span&gt;
    &lt;span class="nf"&gt;imprime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Empréstimo mutável&lt;/span&gt;
    &lt;span class="nf"&gt;modifica&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Valor final: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;imprime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Valor: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;modifica&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Modifica o valor original&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  O que não se pode fazer?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Não se pode ter empréstimos mutáveis e imutáveis ao mesmo tempo sobre o mesmo valor&lt;/strong&gt;. Isso evita situações onde um valor é lido enquanto é modificado, o que poderia causar comportamentos imprevisíveis.&lt;/p&gt;

&lt;p&gt;Porque é que isto é importante?&lt;/p&gt;

&lt;h4&gt;
  
  
  O sistema de Borrowing permite:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Acesso seguro a dados sem cópias desnecessárias&lt;/li&gt;
&lt;li&gt;Controle total sobre quem pode ler ou modificar os dados&lt;/li&gt;
&lt;li&gt;Código mais eficiente e livre de erros como data races&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust obriga a &lt;strong&gt;pensar como os dados são usados&lt;/strong&gt; — e embora pareça exigente no início, dá muito mais poder e confiança a longo prazo.&lt;/p&gt;







&lt;p&gt;If &lt;strong&gt;Ownership&lt;/strong&gt; is the heart of Rust, &lt;strong&gt;Borrowing&lt;/strong&gt; is the brain that allows you to work with data without losing safety.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Borrowing?
&lt;/h2&gt;

&lt;p&gt;In Rust, &lt;strong&gt;borrowing&lt;/strong&gt; a value means using it temporarily without taking ownership of it. This allows multiple parts of the code to access the same data, but &lt;strong&gt;without the risk of invalid accesses or unexpected modifications&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rust"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Borrow 'nome' to the function without transferring ownership&lt;/span&gt;
    &lt;span class="nf"&gt;saudacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 'nome' is still valid here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;saudacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, {}!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&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;h3&gt;
  
  
  Types of Borrowing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&amp;amp;T (Immutable Borrow)&lt;/strong&gt;: Allows reading the value but not modifying it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;amp;mut T (Mutable Borrow)&lt;/strong&gt;: Allows reading and modifying the value, but only one mutable borrow can exist at a time.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// Immutable borrow&lt;/span&gt;
    &lt;span class="nf"&gt;imprime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Mutable borrow&lt;/span&gt;
    &lt;span class="nf"&gt;modifica&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Final value: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;imprime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Value: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;modifica&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Modifies the original value&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What can't you do?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;You cannot have mutable and immutable borrows at the same time over the same value&lt;/strong&gt;. This prevents situations where a value is read while being modified, which could cause unpredictable behavior.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why is this important?
&lt;/h4&gt;

&lt;p&gt;The borrowing system allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Safe access to data without unnecessary copies&lt;/li&gt;
&lt;li&gt;Full control over who can read or modify the data&lt;/li&gt;
&lt;li&gt;More efficient and error-free code, avoiding issues like data races&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust forces you to &lt;strong&gt;think about how data is used&lt;/strong&gt; — and although it may seem demanding at first, it gives you much more power and confidence in the long run.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>borrowing</category>
    </item>
    <item>
      <title>🦀 Rust Ownership: O segredo da programação!/The Coding Secret!</title>
      <dc:creator>slns</dc:creator>
      <pubDate>Fri, 18 Apr 2025 11:22:48 +0000</pubDate>
      <link>https://forem.com/slns/rust-ownership-o-segredo-da-programacaothe-coding-secret-1059</link>
      <guid>https://forem.com/slns/rust-ownership-o-segredo-da-programacaothe-coding-secret-1059</guid>
      <description>&lt;p&gt;Se tem uma coisa que define o Rust, é o conceito de &lt;strong&gt;Ownership&lt;/strong&gt; (Propriedade).&lt;/p&gt;

&lt;p&gt;Esse conceito é o que permite ao Rust ser &lt;strong&gt;seguro e rápido&lt;/strong&gt;, &lt;strong&gt;sem precisar de garbage collector&lt;/strong&gt;. Vamos entender como isto funciona? &lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Ownership?
&lt;/h2&gt;

&lt;p&gt;Em Rust, &lt;strong&gt;cada valor tem um dono&lt;/strong&gt;: a variável que o criou (ou recebeu). Quando essa variável sai de escopo, o valor é &lt;strong&gt;automaticamente libertado da memória&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rust"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- 'nome' é destruído aqui, a memória é libertada&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transferência de Posse (Move)&lt;br&gt;
Se atribuír uma variável a outra, o ownership é &lt;strong&gt;movido&lt;/strong&gt; para a nova variável.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ownership"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 'a' perde a posse, 'b' agora é o dono&lt;/span&gt;

    &lt;span class="c1"&gt;// println!("{}", a); Erro! 'a' não é mais válida aqui&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// correto&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rust faz isso para garantir que nunca existam dois donos ao mesmo tempo — evitando bugs de memória.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que não se pode fazer?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Não se pode usar uma variável depois de perder a posse do valor.&lt;/strong&gt;&lt;br&gt;
O compilador vai impedir a compilação se tentar fazê-lo. Pode parecer rígido no início, mas é isso que torna o código tão seguro.&lt;/p&gt;
&lt;h3&gt;
  
  
  Porque é que isto é importante?
&lt;/h3&gt;

&lt;p&gt;O sistema de ownership permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Segurança de memória sem custos em tempo de execução&lt;/li&gt;
&lt;li&gt;Desempenho comparável ao C/C++&lt;/li&gt;
&lt;li&gt;Código livre de fugas de memória e acessos inválidos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust obriga a pensar &lt;strong&gt;quem é responsável pela memória&lt;/strong&gt; — e embora pareça exigente no início, dá muito mais poder e confiança a longo prazo.&lt;/p&gt;





&lt;p&gt;If there's one thing that defines Rust, it's the concept of &lt;strong&gt;Ownership&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This concept is what allows Rust to be &lt;strong&gt;safe and fast&lt;/strong&gt;, without needing a garbage collector. Let's understand how this works?&lt;br&gt;
What is Ownership?&lt;/p&gt;

&lt;p&gt;In Rust, &lt;strong&gt;each value has an owner&lt;/strong&gt;: the variable that created it (or received it). When this variable goes out of scope, the value is automatically freed from memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rust"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- 'nome' is destroyed here, memory is freed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ownership Transfer (Move)
&lt;/h2&gt;

&lt;p&gt;If you assign a variable to another, the ownership is &lt;strong&gt;moved&lt;/strong&gt; to the new variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ownership"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 'a' loses ownership, 'b' is now the owner&lt;/span&gt;

    &lt;span class="c1"&gt;// println!("{}", a); Error! 'a' is no longer valid here&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// correct&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rust does this to ensure that there are &lt;strong&gt;never two owners at the same time&lt;/strong&gt; — avoiding memory bugs.&lt;/p&gt;

&lt;h3&gt;
  
  
  What can't you do?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;You can't use a variable after losing ownership of the value&lt;/strong&gt;.&lt;br&gt;
The compiler will prevent compilation if you try to do so. It might seem rigid at first, but it's what makes the code so safe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is this important?
&lt;/h3&gt;

&lt;p&gt;The ownership system allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory safety without runtime costs&lt;/li&gt;
&lt;li&gt;Performance comparable to C/C++&lt;/li&gt;
&lt;li&gt;Code free from memory leaks and invalid accesses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust forces you to think about &lt;strong&gt;who is responsible for the memory&lt;/strong&gt; — and although it may seem demanding at first, it gives you much more power and confidence in the long run.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>ownership</category>
    </item>
    <item>
      <title>Code Testing: A Technical Guide to Testing Everything vs. Focusing on Services</title>
      <dc:creator>slns</dc:creator>
      <pubDate>Fri, 15 Nov 2024 09:52:16 +0000</pubDate>
      <link>https://forem.com/slns/code-testing-a-technical-guide-to-testing-everything-vs-focusing-on-services-dn2</link>
      <guid>https://forem.com/slns/code-testing-a-technical-guide-to-testing-everything-vs-focusing-on-services-dn2</guid>
      <description>&lt;p&gt;Testing is at the heart of software quality, but deciding &lt;strong&gt;what to test&lt;/strong&gt; can be tricky. This article explores the pros and cons of testing &lt;strong&gt;every component&lt;/strong&gt; versus focusing &lt;strong&gt;just on services&lt;/strong&gt;, with detailed insights into each phase and component.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 What Does Testing Everything Mean?
&lt;/h2&gt;

&lt;p&gt;Testing everything involves covering all system components: &lt;strong&gt;enums, DTOs, controllers, services, repositories, traits, and utilities.&lt;/strong&gt; This exhaustive approach brings safety but also complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Benefits
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Maximum coverage:&lt;/strong&gt; Each component is validated individually.

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Example:&lt;/em&gt; Testing the &lt;code&gt;OrderStatus&lt;/code&gt; enum ensures invalid values like &lt;code&gt;COMPLETED_WRONG&lt;/code&gt; are rejected.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidence in changes:&lt;/strong&gt; Refactoring doesn’t break unrelated parts of the system.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ❌ Drawbacks
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;High cost:&lt;/strong&gt; Writing and maintaining all these tests takes significant time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test redundancy:&lt;/strong&gt; Logic might be tested multiple times (e.g., in the model and service).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🛠️ What Does Testing Only Services Mean?
&lt;/h2&gt;

&lt;p&gt;This approach assumes that services, which orchestrate other components, adequately represent system behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Benefits
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Time-saving:&lt;/strong&gt; Focuses on critical functionality.

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Example:&lt;/em&gt; A test for &lt;code&gt;OrderService&lt;/code&gt; ensures the entire order creation process works correctly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Essential coverage:&lt;/strong&gt; Prioritizes the tests that matter most for end-users.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ❌ Drawbacks
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hidden bugs:&lt;/strong&gt; Issues in DTOs or validations may go unnoticed.

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Example:&lt;/em&gt; A mapping error in a DTO might not be caught until it’s too late.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harder debugging:&lt;/strong&gt; Finding the source of failures becomes more complex.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧩 How to Test Each Component: A Technical Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Enums and Models&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What to test?&lt;/strong&gt; Behavior, validations, and data integrity.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Example:&lt;/em&gt; An &lt;code&gt;OrderStatus&lt;/code&gt; enum should only accept values like &lt;code&gt;PENDING&lt;/code&gt;, &lt;code&gt;COMPLETED&lt;/code&gt;, and &lt;code&gt;CANCELED&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;DTOs and ViewModels&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What to test?&lt;/strong&gt; Data consistency during serialization/deserialization.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Example:&lt;/em&gt; An &lt;code&gt;OrderDTO&lt;/code&gt; should correctly map JSON data into an expected model.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Controllers&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What to test?&lt;/strong&gt; Routing, HTTP responses, and basic validations.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Example:&lt;/em&gt; A &lt;code&gt;GET /orders&lt;/code&gt; endpoint should return correctly formatted data with a 200 status.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Services and Repositories&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What to test?&lt;/strong&gt; Business rules and data persistence.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Example:&lt;/em&gt; The &lt;code&gt;OrderService&lt;/code&gt; should calculate an order total correctly, including discounts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Factories and Traits&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What to test?&lt;/strong&gt; Reusable functionality.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Example:&lt;/em&gt; A factory creating &lt;code&gt;Order&lt;/code&gt; objects should populate default values as expected.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏗️ The Testing Pyramid: Structuring Your Approach
&lt;/h2&gt;

&lt;p&gt;A balanced approach follows the &lt;strong&gt;testing pyramid&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unit Tests (Base):&lt;/strong&gt; Cover isolated components like enums, DTOs, or small services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration Tests (Middle):&lt;/strong&gt; Ensure components interact properly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End-to-End Tests (Top):&lt;/strong&gt; Validate complete system behavior from the user’s perspective.&lt;/li&gt;
&lt;/ol&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%2Fics5pfw05xrj6kr8pi1x.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%2Fics5pfw05xrj6kr8pi1x.png" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Conclusion: Striking the Ideal Balance
&lt;/h2&gt;

&lt;p&gt;The decision to "test everything" or "only services" depends on your project’s complexity and goals. A pragmatic balance includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✅ Detailed tests for critical components.&lt;/li&gt;
&lt;li&gt;🛠️ Service-focused tests for global functionality.&lt;/li&gt;
&lt;li&gt;🎯 Avoiding redundancy and prioritizing quality over quantity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Final Question:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
How do you structure your tests? Share your thoughts in the comments! 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Php Serialização</title>
      <dc:creator>slns</dc:creator>
      <pubDate>Fri, 31 May 2024 19:16:58 +0000</pubDate>
      <link>https://forem.com/slns/php-serializacao-54o0</link>
      <guid>https://forem.com/slns/php-serializacao-54o0</guid>
      <description>&lt;h1&gt;
  
  
  Serialização e Desserialização em PHP
&lt;/h1&gt;

&lt;h2&gt;
  
  
  O que é Serialização?
&lt;/h2&gt;

&lt;p&gt;Serialização é o processo de converter um objeto ou uma estrutura de dados em uma string. Esta string pode ser armazenada em um arquivo, transmitida pela rede ou armazenada em um banco de dados. A principal vantagem da serialização é que ela permite salvar o estado de um objeto de uma forma que possa ser facilmente recuperada mais tarde.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Desserialização?
&lt;/h2&gt;

&lt;p&gt;Desserialização é o processo inverso da serialização. Ela converte uma string serializada de volta em um objeto ou estrutura de dados original. Isso é útil para recuperar o estado de um objeto que foi salvo anteriormente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funções de Serialização em PHP
&lt;/h2&gt;

&lt;p&gt;PHP fornece funções embutidas para serialização e desserialização:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;serialize()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A função &lt;code&gt;serialize()&lt;/code&gt; converte um valor PHP em uma string serializada.&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;$dados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'nome'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'João'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'idade'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$string_serializada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dados&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$string_serializada&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a:2:{s:4:"nome";s:4:"João";s:5:"idade";i:30;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;unserialize()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A função &lt;code&gt;unserialize()&lt;/code&gt; converte uma string serializada de volta ao seu valor original.&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;$string_serializada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'a:2:{s:4:"nome";s:4:"João";s:5:"idade";i:30;}'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$dados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;unserialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$string_serializada&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dados&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Array
(
    [nome] =&amp;gt; João
    [idade] =&amp;gt; 30
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Casos de Uso Comuns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Armazenamento de Sessões
&lt;/h3&gt;

&lt;p&gt;A serialização é frequentemente usada para armazenar dados de sessão. Quando um utilizador faz login em um site, seus dados podem ser armazenados em uma sessão usando &lt;code&gt;serialize()&lt;/code&gt;. Quando o utilizador retorna, os dados da sessão podem ser recuperados com &lt;code&gt;unserialize()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cache de Dados
&lt;/h3&gt;

&lt;p&gt;Serialização é útil para cache de dados complexos. Por exemplo, uma resposta de API pode ser serializada e armazenada em cache para evitar fazer a mesma chamada repetidamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persistência de Objetos
&lt;/h3&gt;

&lt;p&gt;Objetos em PHP podem ser serializados e armazenados em um banco de dados. Quando necessário, eles podem ser recuperados e desserializados para restaurar seu estado original.&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerações de Segurança
&lt;/h2&gt;

&lt;p&gt;Ao utilizar &lt;code&gt;unserialize()&lt;/code&gt;, é importante ter cuidado, especialmente com dados vindos de fontes não confiáveis. Um dado malicioso pode explorar vulnerabilidades no código e levar à execução de código arbitrário. Portanto, evite desserializar dados não confiáveis ou valide e sanitize adequadamente os dados antes de desserializar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo Prático
&lt;/h2&gt;

&lt;p&gt;Aqui está um exemplo completo de serialização e desserialização de um objeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Classe Exemplo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$idade&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="nv"&gt;$nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$idade&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;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$nome&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;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$idade&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="c1"&gt;// Criar um objeto&lt;/span&gt;
&lt;span class="nv"&gt;$pessoa&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;Pessoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Serializar o objeto&lt;/span&gt;
&lt;span class="nv"&gt;$serializado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pessoa&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Serializado: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$serializado&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Desserializar o objeto&lt;/span&gt;
&lt;span class="nv"&gt;$pessoa_desserializada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;unserialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$serializado&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Desserializado: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$pessoa_desserializada&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;", "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$pessoa_desserializada&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Saída
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Serializado: O:6:"Pessoa":2:{s:4:"nome";s:5:"Maria";s:5:"idade";i:25;}
Desserializado: Maria, 25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;A serialização e desserialização em PHP são técnicas poderosas para persistir e transmitir dados. Ao entender e utilizar corretamente &lt;code&gt;serialize()&lt;/code&gt; e &lt;code&gt;unserialize()&lt;/code&gt;, você pode facilmente salvar e restaurar o estado de dados complexos em suas aplicações PHP.&lt;/p&gt;

</description>
      <category>php</category>
      <category>serialização</category>
      <category>desserialização</category>
    </item>
    <item>
      <title>Php Closure</title>
      <dc:creator>slns</dc:creator>
      <pubDate>Fri, 31 May 2024 19:02:38 +0000</pubDate>
      <link>https://forem.com/slns/php-closure-502</link>
      <guid>https://forem.com/slns/php-closure-502</guid>
      <description>&lt;h3&gt;
  
  
  Closure em PHP
&lt;/h3&gt;

&lt;p&gt;Uma closure em PHP é uma função anônima que pode capturar variáveis do seu escopo circundante. Isso permite que a função acesse essas variáveis mesmo depois que o escopo externo tenha terminado. As closures são úteis para criar funções dinâmicas e encapsular comportamentos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo Básico
&lt;/h4&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="nv"&gt;$mensagem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Olá, mundo!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$minhaClosure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$mensagem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$mensagem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nv"&gt;$minhaClosure&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Saída: Olá, mundo!&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A variável &lt;code&gt;$mensagem&lt;/code&gt; é capturada pela closure através da cláusula &lt;code&gt;use&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A closure é chamada mais tarde e ainda pode acessar &lt;code&gt;$mensagem&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Usando Closure Dentro de uma Função
&lt;/h4&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="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;criarSaudacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$mensagem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Olá, &lt;/span&gt;&lt;span class="nv"&gt;$nome&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Definindo uma closure dentro da função&lt;/span&gt;
    &lt;span class="nv"&gt;$saudacao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$mensagem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$mensagem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// Retornando a closure&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$saudacao&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$saudacaoParaJoao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;criarSaudacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"João"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$saudacaoParaJoao&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Saída: Olá, João!&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, a closure é criada dentro da função &lt;code&gt;criarSaudacao&lt;/code&gt; e captura a variável &lt;code&gt;$mensagem&lt;/code&gt; do seu escopo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Passando Variáveis por Referência
&lt;/h4&gt;

&lt;p&gt;Por padrão, as variáveis são passadas por valor para a closure. Para passá-las por referência, use o operador &lt;code&gt;&amp;amp;&lt;/code&gt;:&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="nv"&gt;$contador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$minhaClosure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;$contador&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$contador&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="nv"&gt;$minhaClosure&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$contador&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Saída: 11&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, a variável &lt;code&gt;$contador&lt;/code&gt; é passada por referência, permitindo que a closure modifique seu valor original.&lt;/p&gt;

&lt;p&gt;As closures em PHP são uma ferramenta poderosa para encapsular lógica e criar funções dinâmicas, mantendo o acesso a variáveis do escopo onde foram definidas.&lt;/p&gt;

</description>
      <category>php</category>
      <category>closure</category>
    </item>
    <item>
      <title>Symfony 6 with docker</title>
      <dc:creator>slns</dc:creator>
      <pubDate>Sat, 19 Nov 2022 16:53:42 +0000</pubDate>
      <link>https://forem.com/slns/symfony-6-with-docker-14i0</link>
      <guid>https://forem.com/slns/symfony-6-with-docker-14i0</guid>
      <description>&lt;p&gt;In this project the intention is to create a project in symfony 6, with docker, mariadb, phpmyadmin.&lt;/p&gt;

&lt;p&gt;To begin with, we will create a page structure similar to the image:&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%2Fxaota2x9z9nqu6ncyul8.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%2Fxaota2x9z9nqu6ncyul8.png" alt="folder struct" width="284" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Make the folders, and some files:&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="nb"&gt;mkdir &lt;/span&gt;symfony-6-docker &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch&lt;/span&gt; .env &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch&lt;/span&gt; .gitignore 
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;docker-compose.yml &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;README.md 
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;docker &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;docker &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;database 
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;logs &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;nginx &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;php-fpm 
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;database &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;data &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;Dockerfile  
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;init.sql &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ../logs &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;nginx 
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;nginx &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;access.log &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;error.log 
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch&lt;/span&gt; .gitignore &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ../../nginx &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;Dockerfile 
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;nginx.conf &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;conf.d &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;sites 
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd  &lt;/span&gt;conf.d &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;default.conf &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ../sites 
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;default.conf &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ../../php-fpm 
&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;wait-for-it.sh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;Dockerfile &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ../..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, it is necessary to verify that we have everything necessary to create a symfony 6 project.&lt;br&gt;
For this we run the command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symfony check:requirements
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you get the same answer as the picture, it means that everything is fine.&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%2F7n4ygq4lutbycqj2n2xd.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%2F7n4ygq4lutbycqj2n2xd.png" alt="approve requirements" width="575" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Having everything ok, we create the project in the project root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; symfony new symfony --version="6.1.*"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With your preferred IDE, open the project in the root, and copy the contents of the files.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;docker-composer.yml
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-composer.yml&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./docker/database&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MYSQL_DATABASE=${DATABASE_NAME}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MYSQL_USER=${DATABASE_USER}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MYSQL_PASSWORD=${DATABASE_PASSWORD}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MYSQL_ROOT_PASSWORD=${DATABASE_ROOT_PASSWORD}&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3309:3306"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./database/init.sql:/docker-entrypoint-initdb.d/init.sql&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./docker/database/data:/var/lib/mysql&lt;/span&gt;

  &lt;span class="na"&gt;phpmyadmin&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;database&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;phpmyadmin&lt;/span&gt;
        &lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;database&lt;/span&gt;
        &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;8080:80&lt;/span&gt;
        &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;PMA_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;database&lt;/span&gt;
            &lt;span class="na"&gt;PMA_PORT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3306&lt;/span&gt;
            &lt;span class="na"&gt;PMA_ARBITRARY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;

  &lt;span class="na"&gt;php-fpm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./docker/php-fpm&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;database&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;APP_ENV=${APP_ENV}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;APP_SECRET=${APP_SECRET}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@database:3306/${DATABASE_NAME}?serverVersion=5.7&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./symfony:/var/www&lt;/span&gt;

  &lt;span class="na"&gt;nginx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./docker/nginx&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./symfony:/var/www&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./docker/nginx/nginx.conf:/etc/nginx/nginx.conf&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./docker/nginx/sites/:/etc/nginx/sites-available&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./docker/nginx/conf.d/:/etc/nginx/conf.d&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./docker/logs:/var/log&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;php-fpm&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:80"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;443:443"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;.env
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABASE_NAME=symfony
DATABASE_USER=appuser
DATABASE_PASSWORD=apppassword
DATABASE_ROOT_PASSWORD=secret

APP_ENV=dev
APP_SECRET=change-to-your-secret-value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;docker/database/Dockerfile
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; mariadb:latest&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["mysqld"]&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3306&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;docker/database/init.sql
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;symfony&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;symfony&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;docker/nginx/Dockerfile
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; nginx:alpine&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /var/www&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["nginx"]&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80 443&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;docker/nginx/nginx.conf
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;user&lt;/span&gt;  &lt;span class="n"&gt;nginx&lt;/span&gt;;
&lt;span class="n"&gt;worker_processes&lt;/span&gt;  &lt;span class="m"&gt;4&lt;/span&gt;;
&lt;span class="n"&gt;daemon&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;;

&lt;span class="n"&gt;error_log&lt;/span&gt;  /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;log&lt;/span&gt;/&lt;span class="n"&gt;nginx&lt;/span&gt;/&lt;span class="n"&gt;error&lt;/span&gt;.&lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="n"&gt;warn&lt;/span&gt;;
&lt;span class="n"&gt;pid&lt;/span&gt;        /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;run&lt;/span&gt;/&lt;span class="n"&gt;nginx&lt;/span&gt;.&lt;span class="n"&gt;pid&lt;/span&gt;;


&lt;span class="n"&gt;events&lt;/span&gt; {
    &lt;span class="n"&gt;worker_connections&lt;/span&gt;  &lt;span class="m"&gt;1024&lt;/span&gt;;
}


&lt;span class="n"&gt;http&lt;/span&gt; {
    &lt;span class="n"&gt;include&lt;/span&gt;       /&lt;span class="n"&gt;etc&lt;/span&gt;/&lt;span class="n"&gt;nginx&lt;/span&gt;/&lt;span class="n"&gt;mime&lt;/span&gt;.&lt;span class="n"&gt;types&lt;/span&gt;;
    &lt;span class="n"&gt;default_type&lt;/span&gt;  &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;octet&lt;/span&gt;-&lt;span class="n"&gt;stream&lt;/span&gt;;

    &lt;span class="n"&gt;access_log&lt;/span&gt;  /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;log&lt;/span&gt;/&lt;span class="n"&gt;nginx&lt;/span&gt;/&lt;span class="n"&gt;access&lt;/span&gt;.&lt;span class="n"&gt;log&lt;/span&gt;;
    &lt;span class="c"&gt;#access_log /dev/stdout;
&lt;/span&gt;    &lt;span class="c"&gt;#error_log /dev/stderr;
&lt;/span&gt;
    &lt;span class="n"&gt;sendfile&lt;/span&gt;        &lt;span class="n"&gt;on&lt;/span&gt;;
    &lt;span class="c"&gt;#tcp_nopush     on;
&lt;/span&gt;
    &lt;span class="n"&gt;keepalive_timeout&lt;/span&gt;  &lt;span class="m"&gt;65&lt;/span&gt;;

    &lt;span class="c"&gt;#gzip  on;
&lt;/span&gt;
    &lt;span class="n"&gt;include&lt;/span&gt; /&lt;span class="n"&gt;etc&lt;/span&gt;/&lt;span class="n"&gt;nginx&lt;/span&gt;/&lt;span class="n"&gt;conf&lt;/span&gt;.&lt;span class="n"&gt;d&lt;/span&gt;/*.&lt;span class="n"&gt;conf&lt;/span&gt;;
    &lt;span class="n"&gt;include&lt;/span&gt; /&lt;span class="n"&gt;etc&lt;/span&gt;/&lt;span class="n"&gt;nginx&lt;/span&gt;/&lt;span class="n"&gt;sites&lt;/span&gt;-&lt;span class="n"&gt;available&lt;/span&gt;/*.&lt;span class="n"&gt;conf&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;docker/nginx/conf.d/default.conf
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;upstream&lt;/span&gt; &lt;span class="n"&gt;php&lt;/span&gt;-&lt;span class="n"&gt;upstream&lt;/span&gt; {
    &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;php&lt;/span&gt;-&lt;span class="n"&gt;fpm&lt;/span&gt;:&lt;span class="m"&gt;9000&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;docker/nginx/sites/default.conf
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;server&lt;/span&gt; {

    &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="n"&gt;default_server&lt;/span&gt;;
    &lt;span class="n"&gt;listen&lt;/span&gt; [::]:&lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="n"&gt;default_server&lt;/span&gt; &lt;span class="n"&gt;ipv6only&lt;/span&gt;=&lt;span class="n"&gt;on&lt;/span&gt;;

    &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;;
    &lt;span class="n"&gt;root&lt;/span&gt; /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;www&lt;/span&gt;/&lt;span class="n"&gt;public&lt;/span&gt;;
    &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;htm&lt;/span&gt;;

    &lt;span class="n"&gt;location&lt;/span&gt; / {
         &lt;span class="n"&gt;try_files&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt;/ /&lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;$&lt;span class="n"&gt;is_args&lt;/span&gt;$&lt;span class="n"&gt;args&lt;/span&gt;;
    }

    &lt;span class="n"&gt;location&lt;/span&gt; ~ \.&lt;span class="n"&gt;php&lt;/span&gt;$ {
        &lt;span class="n"&gt;try_files&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt; /&lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt; =&lt;span class="m"&gt;404&lt;/span&gt;;
        &lt;span class="n"&gt;fastcgi_pass&lt;/span&gt; &lt;span class="n"&gt;php&lt;/span&gt;-&lt;span class="n"&gt;upstream&lt;/span&gt;;
        &lt;span class="n"&gt;fastcgi_index&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;;
        &lt;span class="n"&gt;fastcgi_buffers&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;;
        &lt;span class="n"&gt;fastcgi_buffer_size&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;;
        &lt;span class="n"&gt;fastcgi_param&lt;/span&gt; &lt;span class="n"&gt;SCRIPT_FILENAME&lt;/span&gt; $&lt;span class="n"&gt;document_root&lt;/span&gt;$&lt;span class="n"&gt;fastcgi_script_name&lt;/span&gt;;
        &lt;span class="c"&gt;#fixes timeouts
&lt;/span&gt;        &lt;span class="n"&gt;fastcgi_read_timeout&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;;
        &lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="n"&gt;fastcgi_params&lt;/span&gt;;
    }

    &lt;span class="n"&gt;location&lt;/span&gt; ~ /\.&lt;span class="n"&gt;ht&lt;/span&gt; {
        &lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;;
    }

    &lt;span class="n"&gt;location&lt;/span&gt; /.&lt;span class="n"&gt;well&lt;/span&gt;-&lt;span class="n"&gt;known&lt;/span&gt;/&lt;span class="n"&gt;acme&lt;/span&gt;-&lt;span class="n"&gt;challenge&lt;/span&gt;/ {
        &lt;span class="n"&gt;root&lt;/span&gt; /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;www&lt;/span&gt;/&lt;span class="n"&gt;letsencrypt&lt;/span&gt;/;
        &lt;span class="n"&gt;log_not_found&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;docker/php-fpm/Dockerfile
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:fpm-alpine&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; wait-for-it.sh /usr/bin/wait-for-it&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/bin/wait-for-it

&lt;span class="k"&gt;RUN &lt;/span&gt;apk &lt;span class="nt"&gt;--update&lt;/span&gt; &lt;span class="nt"&gt;--no-cache&lt;/span&gt; add git

&lt;span class="k"&gt;RUN &lt;/span&gt;apk add bash

&lt;span class="k"&gt;RUN &lt;/span&gt;docker-php-ext-install pdo_mysql

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=composer /usr/bin/composer /usr/bin/composer&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /var/www&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; composer install ; wait-for-it database:3306 -- bin/console doctrine:migrations:migrate ;  php-fpm &lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 9000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;docker/php-fpm/wait-for-it.sh
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="nv"&gt;TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;15
&lt;span class="nv"&gt;QUIET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0

echoerr&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$QUIET&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-ne&lt;/span&gt; 1 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 1&amp;gt;&amp;amp;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

usage&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;exitcode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;USAGE&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt;&amp;amp;2
Usage:
  &lt;/span&gt;&lt;span class="nv"&gt;$cmdname&lt;/span&gt;&lt;span class="sh"&gt; host:port [-t timeout] [-- command args]
  -q | --quiet                        Do not output any status messages
  -t TIMEOUT | --timeout=timeout      Timeout in seconds, zero for no timeout
  -- COMMAND ARGS                     Execute command with args after the test finishes
&lt;/span&gt;&lt;span class="no"&gt;USAGE
&lt;/span&gt;  &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$exitcode&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

wait_for&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;seq&lt;/span&gt; &lt;span class="nv"&gt;$TIMEOUT&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;nc &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PORT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1

    &lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="nt"&gt;-gt&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
      &lt;span class="k"&gt;fi
      &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0
    &lt;span class="k"&gt;fi
    &lt;/span&gt;&lt;span class="nb"&gt;sleep &lt;/span&gt;1
  &lt;span class="k"&gt;done
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Operation timed out"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="nt"&gt;-gt&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;do
  case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="k"&gt;*&lt;/span&gt;:&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;| &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; : &lt;span class="nt"&gt;-f&lt;/span&gt; 1&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;| &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; : &lt;span class="nt"&gt;-f&lt;/span&gt; 2&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;shift &lt;/span&gt;1
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;QUIET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
    &lt;span class="nb"&gt;shift &lt;/span&gt;1
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="nt"&gt;-t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TIMEOUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi
    &lt;/span&gt;&lt;span class="nb"&gt;shift &lt;/span&gt;2
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="nt"&gt;--timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="p"&gt;#*=&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;shift &lt;/span&gt;1
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;shift
    break&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="nt"&gt;--help&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    usage 0
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    echoerr &lt;span class="s2"&gt;"Unknown argument: &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    usage 1
    &lt;span class="p"&gt;;;&lt;/span&gt;
  &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="k"&gt;done

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PORT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;echoerr &lt;span class="s2"&gt;"Error: you need to provide a host and port to test."&lt;/span&gt;
  usage 2
&lt;span class="k"&gt;fi

&lt;/span&gt;wait_for &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After copying all the files, go to the root of the project, and run:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
docker-compose up -d&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Link to the project:&lt;br&gt;
&lt;a href="http://localhost" rel="noopener noreferrer"&gt;symfony project&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gwhdfbbhmlccrphd0od.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%2F4gwhdfbbhmlccrphd0od.png" alt="show symfony" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link to the phpmyadmin:&lt;br&gt;
&lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;phpmyadmin&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lx4ehu7rvcd0338b15e.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%2F9lx4ehu7rvcd0338b15e.png" alt="image phpmyadmin" width="590" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project link on GitHub is:&lt;br&gt;
&lt;a href="https://github.com/slns/symfony-6-docker" rel="noopener noreferrer"&gt;symfony-6-docker&lt;/a&gt;&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>discuss</category>
    </item>
    <item>
      <title>cheat sheet, Git Stash</title>
      <dc:creator>slns</dc:creator>
      <pubDate>Wed, 04 Aug 2021 13:18:47 +0000</pubDate>
      <link>https://forem.com/slns/cheat-sheet-git-stash-eb8</link>
      <guid>https://forem.com/slns/cheat-sheet-git-stash-eb8</guid>
      <description>&lt;h3&gt;
  
  
  Git Stash
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Short introduction:
&lt;/h4&gt;

&lt;p&gt;Git stash allows you to save changes without interfering with commits.&lt;/p&gt;

&lt;h5&gt;
  
  
  For the list of all stashs:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  To create a stash(no reference):
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  To retrieve and delete the last stash:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash pop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  To retrieve and keep the last stash:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  To create a stash with identification:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash save nome_do_stash
or
  git stash save 'nome do stash'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  To retrieve and maintain a specific stash:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash apply stash@{n}
or
  git stash apply n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  To retrieve and delete a specific stash:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash pop stash@{n}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  To delete a specific stash
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   git stash drop stash@{n}
or
   git stash drop n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>stash</category>
    </item>
    <item>
      <title>cheat sheet, Git Stash</title>
      <dc:creator>slns</dc:creator>
      <pubDate>Wed, 04 Aug 2021 13:10:47 +0000</pubDate>
      <link>https://forem.com/slns/cheat-sheet-git-stash-33o</link>
      <guid>https://forem.com/slns/cheat-sheet-git-stash-33o</guid>
      <description>&lt;h3&gt;
  
  
  Git Stash
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Introdução resumida:
&lt;/h4&gt;

&lt;p&gt;O git stash permite guardar alterações sem interferir com os commits.&lt;/p&gt;

&lt;h5&gt;
  
  
  Para obter a lista de todos os stashs:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Para criar um stash(sem referencia):
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Para recuperar e apagar o ultimo stash:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash pop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Para recuperar e manter o ultimo stash:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Para criar um stash com identificação:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash save nome_do_stash
ou
  git stash save 'nome do stash'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Para recuperar e manter um stash especifico:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash apply stash@{n}
ou
  git stash apply n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Para recuperar e apagar um stash especifico:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git stash pop stash@{n}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>stash</category>
    </item>
  </channel>
</rss>
