<?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: Lucas Lima</title>
    <description>The latest articles on Forem by Lucas Lima (@lucasltavares).</description>
    <link>https://forem.com/lucasltavares</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%2F1271881%2Fa51f2336-98e8-48ca-bba7-d0c1ec672c8f.png</url>
      <title>Forem: Lucas Lima</title>
      <link>https://forem.com/lucasltavares</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lucasltavares"/>
    <language>en</language>
    <item>
      <title>Decoupling with Laravel: Binding Interfaces to Implementations Using Service Providers</title>
      <dc:creator>Lucas Lima</dc:creator>
      <pubDate>Mon, 03 Feb 2025 14:31:08 +0000</pubDate>
      <link>https://forem.com/lucasltavares/decoupling-with-laravel-binding-interfaces-to-implementations-using-service-providers-3cek</link>
      <guid>https://forem.com/lucasltavares/decoupling-with-laravel-binding-interfaces-to-implementations-using-service-providers-3cek</guid>
      <description>&lt;p&gt;Do you know what are service providers and how they work on Laravel? &lt;/p&gt;

&lt;p&gt;In this Article we'll &lt;strong&gt;provide&lt;/strong&gt; a real world example creating an interface and using a service provider to bind it to an implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a service provider in Laravel?
&lt;/h2&gt;

&lt;p&gt;According to Laravel's docs: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Service providers are the central place of all Laravel application bootstrapping. Your own application, as well as all of Laravel's core services, are bootstrapped via service providers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That means all core services on Laravel (Middlewares, Routes, Mailers, queues, etc) are "bootstraped" via service providers.&lt;/p&gt;

&lt;p&gt;If you want to learn more about how service providers work, check out &lt;a href="https://laravel.com/docs/11.x/providers" rel="noopener noreferrer"&gt;Laravel docs&lt;/a&gt;, in this tutorial we'll focus on using service providers and interfaces to implement dependency injection, and the adapter pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-world example: Interface
&lt;/h2&gt;

&lt;p&gt;So, let's supose you want to create a User Repository class, but you are not sure if you will change your project's ORM in the future. &lt;/p&gt;

&lt;p&gt;That's the perfect scenario to use an interface + adapter pattern, right? This way you only create a &lt;code&gt;UserRepository&lt;/code&gt; Interface and you can have multiple implementations like &lt;code&gt;EloquentUserRepository&lt;/code&gt;, &lt;code&gt;DoctrineUserRepository&lt;/code&gt;, &lt;code&gt;PDOUserRepository&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;So our Interface would be like this:&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="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&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;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UserFormRequest&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But when you inject the interface on the controller or service layer how do you bind the implementation you want to use to the interface?&lt;/p&gt;

&lt;h2&gt;
  
  
  Injecting the interface on the controller/service layer:
&lt;/h2&gt;

&lt;p&gt;So, now we have a User controller that receives the UserRepository via Dependency injection, it looks like this:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;UserRepository&lt;/span&gt; &lt;span class="nv"&gt;$repository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Dependency injection&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;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UsersFormRequest&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$serie&lt;/span&gt; &lt;span class="o"&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;repository&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How our application knows that we want specific &lt;code&gt;EloquentUserRepository&lt;/code&gt; instead &lt;code&gt;DoctrineUserRepository&lt;/code&gt; for example? That's how service provider work their magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Binding the interface to the chosen implementation
&lt;/h2&gt;

&lt;p&gt;First, we'll create our service provider using the artisan command: &lt;code&gt;php artisan make:provider UserRepositoryProvider&lt;/code&gt;. Now we have a new provider on &lt;code&gt;app\Providers\UserRepositoryProvider.php&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserRepositoryProvider&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ServiceProvider&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cd"&gt;/**
     * Register services.
     *
     * @return void
     */&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;register&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;app&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;\App\Repositories\UserRepository&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;\App\Repositories\EloquentUserRepository&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;register()&lt;/code&gt; method will take charge to bind our interface to the chosen implementation (EloquentUserRepository), so in the future, if we want to change this implementation to Doctrine for example, we just need to change on our service provider!&lt;/p&gt;

&lt;h2&gt;
  
  
  App Config
&lt;/h2&gt;

&lt;p&gt;Lastly, we need to add this provider to our Laravel's &lt;code&gt;app.php&lt;/code&gt; config file, so it knows what to do. in &lt;code&gt;app\config\app.php&lt;/code&gt; on providers array you will add this line:&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="nc"&gt;App\Providers\UserRepositoryProvider&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it! Now you have an interface binded to a real implementation using service providers. That's one use of case to this great feature of laravel, but you can explore more on &lt;a href="https://laravel.com/docs/11.x/providers" rel="noopener noreferrer"&gt;Laravel docs&lt;/a&gt; to discover more possibilities.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Check my new post!</title>
      <dc:creator>Lucas Lima</dc:creator>
      <pubDate>Mon, 02 Dec 2024 14:26:47 +0000</pubDate>
      <link>https://forem.com/lucasltavares/check-my-new-post-4ihc</link>
      <guid>https://forem.com/lucasltavares/check-my-new-post-4ihc</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/lucasltavares" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F1271881%2Fa51f2336-98e8-48ca-bba7-d0c1ec672c8f.png" alt="lucasltavares"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/lucasltavares/deploying-a-breeze-laravel-app-on-render-part-1-33i0" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Deploying a Laravel Breeze App on Render: Step-by-Step Guide (Part 1)&lt;/h2&gt;
      &lt;h3&gt;Lucas Lima ・ Dec 2&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Deploying a Breeze Laravel app on Render - part 2</title>
      <dc:creator>Lucas Lima</dc:creator>
      <pubDate>Mon, 02 Dec 2024 13:52:23 +0000</pubDate>
      <link>https://forem.com/lucasltavares/deploying-a-breeze-laravel-app-on-render-part-2-4g3f</link>
      <guid>https://forem.com/lucasltavares/deploying-a-breeze-laravel-app-on-render-part-2-4g3f</guid>
      <description>&lt;p&gt;Now that we've successfully configured our Laravel app to be published on Render cloud, we'll access the admin panel to configure the environment and finally deploy our application!&lt;/p&gt;

&lt;p&gt;First we'll login in our Render account and Create a new project, fill with you project's info:&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%2F1jpx5771jfal906oofuk.jpeg" 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%2F1jpx5771jfal906oofuk.jpeg" alt="Image description" width="713" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, on our brand new project we'll first create our Postgresql database. Go to &lt;code&gt;+ New&lt;/code&gt; on top right and click &lt;code&gt;PostgreSQL&lt;/code&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%2Fiwab7ppeeosk5p3i34o9.jpeg" 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%2Fiwab7ppeeosk5p3i34o9.jpeg" alt="step1" width="452" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After creating our database instance we'll need to copy the internal database URL. Access your database instance and copy it here:&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%2Fpj1rmelaf5r8risokqkd.jpeg" 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%2Fpj1rmelaf5r8risokqkd.jpeg" alt="step2" width="800" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we'll create our Web Service instance, on top right click `+ New -&amp;gt; Web Service&lt;/p&gt;

&lt;p&gt;Select your laravel project on github&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%2F3p56h01vpcnzngnb3i5r.jpeg" 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%2F3p56h01vpcnzngnb3i5r.jpeg" alt="step3" width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On language select choose &lt;code&gt;Docker&lt;/code&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%2Fv9xad0ccd34hl05k9tyg.jpeg" 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%2Fv9xad0ccd34hl05k9tyg.jpeg" alt="step4" width="800" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, add this environment variables:&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%2Fejhpkh5ety1tpi8m4gkk.jpeg" 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%2Fejhpkh5ety1tpi8m4gkk.jpeg" alt="step5" width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now just click Deploy webservice and see the magic happening!&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%2Fo0b5c4xbo43udyoeaiaj.jpeg" 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%2Fo0b5c4xbo43udyoeaiaj.jpeg" alt="step6" width="258" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that you'll see a success message and receive a link to access your project online, have fun!&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%2Fsw5b3l37yt4kwc41jecd.jpeg" 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%2Fsw5b3l37yt4kwc41jecd.jpeg" alt="last_step" width="518" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploying a Laravel Breeze App on Render: Step-by-Step Guide (Part 1)</title>
      <dc:creator>Lucas Lima</dc:creator>
      <pubDate>Mon, 02 Dec 2024 12:37:10 +0000</pubDate>
      <link>https://forem.com/lucasltavares/deploying-a-breeze-laravel-app-on-render-part-1-33i0</link>
      <guid>https://forem.com/lucasltavares/deploying-a-breeze-laravel-app-on-render-part-1-33i0</guid>
      <description>&lt;p&gt;On this tutorial I'll explain how to deploy a laravel app using Breeze starter kit on Render.&lt;/p&gt;

&lt;p&gt;Render is a cloud application platform that allows users to perform automated deploys of their projects hosted on any git repository with many features like logs and metrics monitoring, scaling, automating and much more, check out all of their features on &lt;a href="https://render.com/" rel="noopener noreferrer"&gt;this link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Configuring The docker environment
&lt;/h2&gt;

&lt;p&gt;In order to deploy a Laravel app on our render workspace we'll first need to configure a docker environment with a &lt;code&gt;Dockerfile&lt;/code&gt;, &lt;code&gt;Nginx conf&lt;/code&gt; and a deploy bash script.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. .Dockerignore
&lt;/h2&gt;

&lt;p&gt;First, we'll need to create our &lt;code&gt;.dockerignore&lt;/code&gt; file on the project root folder in order to specify wich files will not be included on the build ṕrocess, so our docker image become lighter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/node_modules
/public/hot
/public/storage
/storage/&lt;span class="k"&gt;*&lt;/span&gt;.key
/vendor
.env
.phpunit.result.cache
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Creating the &lt;code&gt;Dockerfile&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;On this step we'll create our dockerfile on the prioject root folder, specifying all the resources that we need to run our laravel app with breeze starter kit&lt;br&gt;
&lt;/p&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; richarvey/nginx-php-fpm:latest&lt;/span&gt;
&lt;span class="c"&gt;# Certifique-se de que o sistema está pronto para instalar pacotes&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; root&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apk update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apk add &lt;span class="nt"&gt;--no-cache&lt;/span&gt; curl nodejs npm &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; npm@latest
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="c"&gt;# Image config&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; SKIP_COMPOSER 1&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; WEBROOT /var/www/html/public&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PHP_ERRORS_STDERR 1&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; RUN_SCRIPTS 1&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; REAL_IP_HEADER 1&lt;/span&gt;

&lt;span class="c"&gt;# Laravel config&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; APP_ENV production&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; APP_DEBUG false&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; LOG_CHANNEL stderr&lt;/span&gt;

&lt;span class="c"&gt;# Allow composer to run as root&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; COMPOSER_ALLOW_SUPERUSER 1&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["/start.sh"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On this file, we added this specific instruction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RUN apk update &amp;amp;&amp;amp; \
    apk add --no-cache curl nodejs npm &amp;amp;&amp;amp; \
    npm install -g npm@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That will allow us to install nodejs on our image in order to run vite, which is included in laravel breeze.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Nginx configuration
&lt;/h2&gt;

&lt;p&gt;Now we'll create a directory on our project root folder named &lt;code&gt;conf/nginx&lt;/code&gt; and place the following &lt;code&gt;ngix-site.conf&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;# Render provisions and terminates SSL&lt;/span&gt;
  &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;# Make site accessible from http://localhost/&lt;/span&gt;
  &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/html/public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt; &lt;span class="s"&gt;index.htm&lt;/span&gt; &lt;span class="s"&gt;index.php&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;# Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html&lt;/span&gt;
  &lt;span class="kn"&gt;sendfile&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;# Add stdout logging&lt;/span&gt;
  &lt;span class="kn"&gt;error_log&lt;/span&gt; &lt;span class="n"&gt;/dev/stdout&lt;/span&gt; &lt;span class="s"&gt;info&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="n"&gt;/dev/stdout&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;# block access to sensitive information about git&lt;/span&gt;
  &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/.git&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;"SAMEORIGIN"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-XSS-Protection&lt;/span&gt; &lt;span class="s"&gt;"1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;mode=block"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;"nosniff"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;charset&lt;/span&gt; &lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="n"&gt;/index.php?&lt;/span&gt;&lt;span class="nv"&gt;$query_string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;/favicon.ico&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;log_not_found&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;/robots.txt&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;log_not_found&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kn"&gt;error_page&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="n"&gt;/index.php&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.(jpg|jpeg|gif|png|css|js|ico|webp|tiff|ttf|svg)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;5d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;\.php$&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;fastcgi_split_path_info&lt;/span&gt; &lt;span class="s"&gt;^(.+&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.php)(/.+)&lt;/span&gt;$&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;fastcgi_pass&lt;/span&gt; &lt;span class="s"&gt;unix:/var/run/php-fpm.sock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;fastcgi_index&lt;/span&gt; &lt;span class="s"&gt;index.php&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;fastcgi_param&lt;/span&gt; &lt;span class="s"&gt;SCRIPT_FILENAME&lt;/span&gt; &lt;span class="nv"&gt;$document_root$fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;fastcgi_param&lt;/span&gt; &lt;span class="s"&gt;SCRIPT_NAME&lt;/span&gt; &lt;span class="nv"&gt;$fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="s"&gt;fastcgi_params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;# deny access to . files&lt;/span&gt;
  &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/\.&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;log_not_found&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/\.(?!well-known).*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Build sh script
&lt;/h2&gt;

&lt;p&gt;Finally, on our project root folder we'll create a &lt;code&gt;scripts&lt;/code&gt; directory and inside a sh build script named &lt;code&gt;00-laravel-deploy.sh&lt;/code&gt; used by render to run bootstrap laravel commands like migrations, composer install and also ou npm commands, needed by vite.&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="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Running composer"&lt;/span&gt;
composer global require hirak/prestissimo
composer &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-dev&lt;/span&gt; &lt;span class="nt"&gt;--working-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/www/html
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Caching config..."&lt;/span&gt;
php artisan config:cache
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Caching routes..."&lt;/span&gt;
php artisan route:cache
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Running npm install..."&lt;/span&gt;
npm &lt;span class="nb"&gt;install
echo&lt;/span&gt; &lt;span class="s2"&gt;"Running npm build..."&lt;/span&gt;
npm run build
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Running migrations..."&lt;/span&gt;
php artisan migrate &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Oops, I almost forgot
&lt;/h2&gt;

&lt;p&gt;There's a configuration in Laravel app Service provider so our app can run using &lt;code&gt;https&lt;/code&gt;, let's add in to our &lt;code&gt;app/Providers/AppServiceProvider.php&lt;/code&gt; file:&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="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Providers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Routing\UrlGenerator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\ServiceProvider&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppServiceProvider&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ServiceProvider&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&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;boot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UrlGenerator&lt;/span&gt; &lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'APP_ENV'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;forceScheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Push to a github repository
&lt;/h2&gt;

&lt;p&gt;Now, we have to push this project to a github repository, and in the next part of this tutorial we'll access &lt;a href="https://render.com" rel="noopener noreferrer"&gt;Render&lt;/a&gt; admin panel and run our application on the cloud!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/lucasltavares/deploying-a-breeze-laravel-app-on-render-part-2-4g3f"&gt;Part 2&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Use Vultr Object Storage with Laravel (S3-Compatible)</title>
      <dc:creator>Lucas Lima</dc:creator>
      <pubDate>Mon, 25 Nov 2024 15:07:20 +0000</pubDate>
      <link>https://forem.com/lucasltavares/how-to-use-vultr-object-storage-with-laravel-s3-compatible-4coo</link>
      <guid>https://forem.com/lucasltavares/how-to-use-vultr-object-storage-with-laravel-s3-compatible-4coo</guid>
      <description>&lt;h2&gt;
  
  
  First steps
&lt;/h2&gt;

&lt;p&gt;In this tutorial I assume that you have already prepared your Laravel project environment and have begginer/intermediate knowledge in PHP/Laravel. &lt;/p&gt;

&lt;p&gt;First of all, we need to prepare our object storage environment on Vultr's admin panel. If you don't have a Vultr account just create one &lt;a href="https://www.vultr.com/register/" rel="noopener noreferrer"&gt;here&lt;/a&gt;. As soon as you have created your account you'll need to create an object storage and then a bucket. For this tutorial focus on how to implement this feature on Laravel i'll just skip this steps and leave a link wich explain all of them &lt;a href="https://docs.vultr.com/vultr-object-storage" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Installing required packages
&lt;/h2&gt;

&lt;p&gt;To achieve our goal, we need to install &lt;em&gt;flysystem&lt;/em&gt;. Flysystem is a well-known file storage library for PHP, it supports many filesystems and provides interfaces for all of them. In our case we'll specifically use aws-s3 but if you want to know more about the library feel free to visit their official documentation page &lt;a href="https://flysystem.thephpleague.com/docs/adapter/aws-s3-v3/" rel="noopener noreferrer"&gt;here&lt;/a&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="n"&gt;composer&lt;/span&gt; &lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="n"&gt;league&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;flysystem&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;v3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Configuration on Laravel
&lt;/h2&gt;

&lt;p&gt;After we've successfully installed our dependency we need now to communicate Laravel that we have a new filesystem and it's credentials.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;config\filesystems.php&lt;/code&gt; on &lt;code&gt;disks&lt;/code&gt; array you'll add the following:&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="s1"&gt;'vultr'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  
&lt;span class="s1"&gt;'driver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'s3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
&lt;span class="s1"&gt;'key'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'VULTR_ACCESS_KEY'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
&lt;span class="s1"&gt;'secret'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'VULTR_SECRET_KEY'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
&lt;span class="s1"&gt;'region'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'VULTR_REGION'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
&lt;span class="s1"&gt;'bucket'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'VULTR_BUCKET'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
&lt;span class="s1"&gt;'endpoint'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'VULTR_ENDPOINT'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;obs: You can obtain all this information in vult's panel on object storage section.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Environment variables
&lt;/h2&gt;

&lt;p&gt;Now we need to add our credentials to &lt;code&gt;.env&lt;/code&gt; to authenticate and execute the proper functions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;VULTR_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;youraccesskey  
&lt;span class="nv"&gt;VULTR_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yoursecretkey  
&lt;span class="nv"&gt;VULTR_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sjc1  
&lt;span class="nv"&gt;VULTR_BUCKET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yourbucket  
&lt;span class="nv"&gt;VULTR_ENDPOINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://sjc1.vultrobjects.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. And Voilà!
&lt;/h2&gt;

&lt;p&gt;Now we can just call our storage class specifying the previously configured vultr disk:&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="nc"&gt;Storage&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'vultr'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;putFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'uploads'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can perform all object storage action within our laravel application!&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://laravel.com/docs/11.x/filesystem" rel="noopener noreferrer"&gt;https://laravel.com/docs/11.x/filesystem&lt;/a&gt;&lt;br&gt;
&lt;a href="https://ecwebservices.medium.com/how-to-use-vultr-object-storage-with-laravel-8-a21256f1b4a1" rel="noopener noreferrer"&gt;https://ecwebservices.medium.com/how-to-use-vultr-object-storage-with-laravel-8-a21256f1b4a1&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>s3</category>
      <category>vultr</category>
    </item>
  </channel>
</rss>
