<?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>DEV Community: Don Cadavona</title>
    <description>The latest articles on DEV Community by Don Cadavona (@doncadavona).</description>
    <link>https://dev.to/doncadavona</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%2F433094%2Faa778361-76b8-4d04-8cc5-787de29bda5b.gif</url>
      <title>DEV Community: Don Cadavona</title>
      <link>https://dev.to/doncadavona</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/doncadavona"/>
    <language>en</language>
    <item>
      <title>Create 1 Million Fake Users in Laravel Fast in Under 5 Minutes</title>
      <dc:creator>Don Cadavona</dc:creator>
      <pubDate>Wed, 20 Mar 2024 04:19:54 +0000</pubDate>
      <link>https://dev.to/doncadavona/create-1-million-fake-users-in-laravel-in-5-minutes-33i3</link>
      <guid>https://dev.to/doncadavona/create-1-million-fake-users-in-laravel-in-5-minutes-33i3</guid>
      <description>&lt;p&gt;Laravel has a neat way of generating fake data to your database for development and testing purposes.&lt;/p&gt;

&lt;p&gt;Using &lt;a href="https://laravel.com/docs/10.x/seeding" rel="noopener noreferrer"&gt;Laravel Seeding&lt;/a&gt;, you can quickly seed a hundred records to your users table. That's done in less than a second, no problem.&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;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&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;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;How about a thousand? Okay, that's done in around 4 seconds:&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;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&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;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;How about a hundred-thousand? That takes around 6 minutes, and starts hurting your server:&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;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100000&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;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Now how about a million? Don't even bother, your server will freeze to death:&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;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000000&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;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;So, how can we actually seed fake 1-million users to our database? We use &lt;strong&gt;chunking&lt;/strong&gt; and &lt;strong&gt;database transactions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is our &lt;code&gt;OneMillionUsersSeeder&lt;/code&gt; class generated via &lt;code&gt;php artisan make:seeder OneMillionUsersSeeder&lt;/code&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="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Database\Seeders&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;App\Models\User&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\Database\Console\Seeds\WithoutModelEvents&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\Database\Seeder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Illuminate\Support\Facades\DB&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;OneMillionUsersSeeder&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Seeder&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cd"&gt;/**
     * The number of fake users to create.
     */&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nv"&gt;$users_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * The number of fake users to chunk
     * based on the users count.
     */&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nv"&gt;$chunk_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * Create 1-million users quickly (~5 minutes)
     * in non-production environments such as
     * local and staging environments.
     * 
     * To do this, we implement chunking and database transactions
     * to speed up the process significantly and reliably.
     */&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;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&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;app&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;environment&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="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$users_count&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$chunk_size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&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="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;beginTransaction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$chunk_size&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;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

                &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;rollback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Here it is run by the cheapest 5USD VM in Linode:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fl86wnx7f9u1jcr4vlnjf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fl86wnx7f9u1jcr4vlnjf.png" alt="Image description" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1-million fake users created in 332,443 ms (5 minutes).&lt;/p&gt;

&lt;p&gt;How about a billion? We shall see.&lt;/p&gt;

&lt;p&gt;You may see the demo Laravel source code &lt;a href="https://github.com/doncadavona/laravel-1-million-fake-users-seeder-demo" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Set Up LEMP for Laravel on Windows using WSL</title>
      <dc:creator>Don Cadavona</dc:creator>
      <pubDate>Fri, 13 May 2022 02:27:00 +0000</pubDate>
      <link>https://dev.to/doncadavona/set-up-lemp-for-laravel-on-windows-using-wsl-5cmh</link>
      <guid>https://dev.to/doncadavona/set-up-lemp-for-laravel-on-windows-using-wsl-5cmh</guid>
      <description>&lt;h2&gt;
  
  
  Chapters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;I. Introduction&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;II. Install Windows Terminal&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;III. Install WSL Ubuntu&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IV. Install Nginx&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;V. Install MySQL&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VI. Install PHP and Composer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VII. Create a Laravel Application&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VIII. Manage Multiple Laravel Applications and PHP Versions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IX. Extras&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I. Introduction
&lt;/h2&gt;

&lt;p&gt;Finally, we can set up a &lt;em&gt;true&lt;/em&gt; &lt;strong&gt;Linux, Nginx, MySQL and Php&lt;/strong&gt; (LEMP) environment on our Windows machine using &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/" rel="noopener noreferrer"&gt;Windows Subsystem for Linux (WSL)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're a Linux or Mac user, but you're forced to use a Windows machine just like me, or, if you simply want to develop web applications on your Windows PC while still on a Linux or Unix-like environment without dual-booting, this guide is for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not just use &lt;a href="https://www.google.com/search?q=xampp+vs+mamp+vs+wamp" rel="noopener noreferrer"&gt;XAMPP, WAMP or MAMP&lt;/a&gt;?&lt;/strong&gt; Well, these are functional until they aren't. They are very clunky, they can't make your local projects look good with domains like &lt;u&gt;myproject.test&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not use &lt;a href="https://laravel.com/docs/homestead" rel="noopener noreferrer"&gt;Homestead&lt;/a&gt;?&lt;/strong&gt; Well, I wished I did, until I gave up trying to make it work on my Windows PC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not use &lt;a href="http://laragon.com/" rel="noopener noreferrer"&gt;Laragon&lt;/a&gt;?&lt;/strong&gt; I do use Laragon! I love it. It's lightweight, configurable, gives beautiful local domains like &lt;u&gt;myproject.test&lt;/u&gt; and also supports sharing your local project to the internet using &lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;Ngrok&lt;/a&gt;.&lt;br&gt;
But, it is still not a true Linux/Unix-like environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why use WSL&lt;/strong&gt;? It's the real deal! It's lightweight and fast! It's official! You get to deal with a true Linux environment here. You setup your project on your local machine the same as you would in a real remote Linux server. This way, you are already practicing your server-administration skills.&lt;/p&gt;
&lt;h2&gt;
  
  
  II. Install Windows Terminal
&lt;/h2&gt;

&lt;p&gt;Install Windows Terminal from Microsoft Store:&lt;br&gt;
&lt;a href="https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701" rel="noopener noreferrer"&gt;https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  III. Install WSL and Ubuntu
&lt;/h2&gt;

&lt;p&gt;We will be using Ubuntu 20.04 as it is the default and the latest stable Linux distribution supported by WSL.&lt;/p&gt;

&lt;p&gt;To install WSL and Ubuntu 20.04, follow the official guide:&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/install" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/windows/wsl/install&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once WSL Ubuntu is installed, open a new Ubuntu tab in Windows Terminal.&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;cd ~&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo apt update&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  IV. Install Nginx
&lt;/h2&gt;

&lt;p&gt;$ &lt;code&gt;sudo apt install nginx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To start, stop or restart Nginx, run:&lt;br&gt;
$ &lt;code&gt;sudo service nginx start&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo service nginx stop&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo service nginx restart&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  V. Install MySQL
&lt;/h2&gt;

&lt;p&gt;To install MySQL, run:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;sudo apt install mysql-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To start, stop or restart MySQL, run:&lt;br&gt;
$ &lt;code&gt;sudo service mysql start&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo service mysql stop&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo service mysql restart&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Connect to MySQL:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;sudo mysql&lt;/code&gt; &lt;em&gt;&amp;lt;-- If username and password is not needed.&lt;/em&gt;&lt;br&gt;
or&lt;br&gt;
$ &lt;code&gt;sudo mysql -u root -p&lt;/code&gt; &lt;em&gt;&amp;lt;-- If username and password is needed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Inside MySQL, create a new database for our example Laravel application:&lt;/p&gt;

&lt;p&gt;mysql &amp;gt; &lt;code&gt;create database laravel;&lt;/code&gt;&lt;br&gt;
mysql &amp;gt; &lt;code&gt;exit;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For a comprehensive guide on MySQL, see &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04" rel="noopener noreferrer"&gt;How To Install MySQL on Ubuntu 20.04&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you encounter the error &lt;code&gt;Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock'&lt;/code&gt;, resolve it by following the solution at &lt;a href="https://stackoverflow.com/a/56684498/3936053" rel="noopener noreferrer"&gt;Stack Overflow&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo service mysql stop
sudo mkdir -p /var/run/mysqld
sudo chown mysql:mysql /var/run/mysqld
sudo mysql service start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  VI. Install PHP and Composer
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install PHP
&lt;/h3&gt;

&lt;p&gt;To install PHP and the recommended extensions, run:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;sudo apt install php php-fpm php-mysql php-mbstring php-xml php-bcmath php-zip php-curl&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;*Note that this will install PHP 7.4, which is the latest stable version supported by Ubuntu 20.04. To show the supported PHP version in Ubuntu, run $ &lt;code&gt;sudo apt show php&lt;/code&gt; or $ &lt;code&gt;sudo apt show php -a&lt;/code&gt;. To show the installed PHP version, run $ &lt;code&gt;php -v&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To start, stop or restart PHP, run:&lt;br&gt;
$ &lt;code&gt;sudo service php7.4-fpm start&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo service php7.4 stop&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo service php7.4 restart&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Install Composer
&lt;/h3&gt;

&lt;p&gt;To install &lt;a href="https://getcomposer.org" rel="noopener noreferrer"&gt;Composer&lt;/a&gt;, see &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-composer-on-ubuntu-20-04" rel="noopener noreferrer"&gt;How To Install and Use Composer on Ubuntu 20.04&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  VII. Creating a Laravel Application
&lt;/h2&gt;

&lt;p&gt;First, create a directory for our Laravel projects inside our home:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;cd ~&lt;/code&gt; &amp;lt;-- Go to our home directory.&lt;br&gt;
$ &lt;code&gt;mkdir codes&lt;/code&gt; &amp;lt;-- Make a new directory called "codes".&lt;br&gt;
$ &lt;code&gt;cd codes&lt;/code&gt; &amp;lt;-- Go to the new "codes" directory.&lt;/p&gt;

&lt;p&gt;Create a new Laravel application via Composer:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;composer create-project laravel/laravel&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;cd laravel&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Our new Laravel application is now ready to be served:&lt;br&gt;
$ &lt;code&gt;php artisan serve&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To see our running Laravel application, visit &lt;a href="http://127.0.0.1:8000" rel="noopener noreferrer"&gt;http://127.0.0.1:8000&lt;/a&gt; in a web browser in our local machine.&lt;/p&gt;

&lt;p&gt;You may now work on your project from here:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;code .&lt;/code&gt; &lt;em&gt;&amp;lt;-- Open your Laravel application in VS Code&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sometimes, you will need to work with databases, this is the "M" part in LEMP. To connect the Laravel application's database, update the &lt;code&gt;.env&lt;/code&gt; environment configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_NAME=laravel
DB_USERNAME=root
DB_PASSWORD=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After your database connection has been set, start the migration script to create the database tables:&lt;br&gt;
$ &lt;code&gt;php artisan migrate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🎉🙌👏 &lt;strong&gt;Hurray!&lt;/strong&gt; You now have a running Laravel application and confirms that you have successfully setup your LEMP:&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%2Fct4vuu4jzgu3ss8tcs2s.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%2Fct4vuu4jzgu3ss8tcs2s.png" alt="Image description" width="800" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this chapter, we are simply serving our Laravel application using the built-in server $ &lt;code&gt;php artisan serve&lt;/code&gt;. In the next Chapter VIII, we will use Nginx to serve multiple Laravel applications without $ &lt;code&gt;php artisan serve&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  VIII. Manage Multiple Laravel Applications and PHP Versions
&lt;/h2&gt;

&lt;p&gt;Eventually, you will need to work with multiple Laravel applications, &lt;em&gt;and perhaps even other PHP applications&lt;/em&gt;, each may require other PHP versions. This is  managed by adding virtual host configurations for each Laravel application. Then, we add each domain to Windows' &lt;code&gt;C:\Windows\System32\drivers\etc\hosts&lt;/code&gt; file. This way, we will no longer need to run $ &lt;code&gt;php artisan serve&lt;/code&gt; for each application every time, and, we will have more readable domains for each application, eg &lt;code&gt;laravel.local&lt;/code&gt;, &lt;code&gt;myblog.test&lt;/code&gt;, &lt;code&gt;todos.test&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;As an example, we will make our first Laravel application called "&lt;strong&gt;laravel&lt;/strong&gt;" accessible at &lt;strong&gt;&lt;a href="http://laravel.local" rel="noopener noreferrer"&gt;http://laravel.local&lt;/a&gt;&lt;/strong&gt;. We will then create two additional Laravel applications called "&lt;strong&gt;todo&lt;/strong&gt;" and "&lt;strong&gt;blog&lt;/strong&gt;". Each application requires &lt;strong&gt;PHP 5.6&lt;/strong&gt; and &lt;strong&gt;PHP 7.3&lt;/strong&gt; and can be visited in a browser at &lt;strong&gt;&lt;a href="http://todo.local" rel="noopener noreferrer"&gt;http://todo.local&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="http://blog.local" rel="noopener noreferrer"&gt;http://blog.local&lt;/a&gt;&lt;/strong&gt; respectively. Of course, you may change the application names as needed.&lt;/p&gt;

&lt;p&gt;Create the &lt;strong&gt;todo&lt;/strong&gt; and &lt;strong&gt;blog&lt;/strong&gt; Laravel applications in &lt;code&gt;/var/www&lt;/code&gt; via Composer, then setup each application. Refer to &lt;strong&gt;Chapter VI. Create a Laravel Application&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo composer create-project laravel/laravel /var/www/todo
sudo composer create-project laravel/laravel /var/www/blog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, give group ownership of our Laravel directory structures to the user and webserver group, and, change the permissions of the &lt;code&gt;storage&lt;/code&gt; and &lt;code&gt;bootstrap/cache&lt;/code&gt; directories to allow the web group write permissions. This is necessary for the application to function correctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo chown -R $USER:www-data /var/www/todo/storage
sudo chown -R $USER:www-data /var/www/todo/bootstrap/cache
sudo chmod -R 775 /var/www/todo/storage
sudo chmod -R 775 /var/www/todo/bootstrap/cache

sudo chown -R $USER:www-data /var/www/blog/storage
sudo chown -R $USER:www-data /var/www/blog/bootstrap/cache
sudo chmod -R 775 /var/www/blog/storage
sudo chmod -R 775 /var/www/blog/bootstrap/cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sometimes, you may need to clear temporary Laravel files before setting the permission:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan route:clear
php artisan config:clear
php artisan cache:clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;...continue the necessary setup for each application. See Chapter VII: Create a Laravel Application.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Multiple PHP Versions
&lt;/h3&gt;

&lt;p&gt;Note that Ubuntu 20.04 ships with PHP 7.4 by default. Officially, the only available version is PHP 7.4. To install alternative PHP versions, first, we need to add PHP repositories via &lt;a href="https://launchpad.net/~ondrej" rel="noopener noreferrer"&gt;ondrej&lt;/a&gt;'s &lt;a href="https://launchpad.net/~ondrej/+archive/ubuntu/php" rel="noopener noreferrer"&gt;Ubuntu Personal Package Archive (PPA)&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install lsb-release ca-certificates apt-transport-https software-properties-common -y
sudo add-apt-repository ppa:ondrej/php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can now install multiple PHP versions and their respective recommended extensions for Laravel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update

# Install PHP 5.6:
sudo apt install php5.6 php5.6-fpm php5.6-mysql php5.6-mbstring php5.6-xml php5.6-bcmath php5.6-zip php5.6-curl php5.6-gd

# Install PHP 7.0:
sudo apt install php7.0 php7.0-fpm php7.0-mysql php7.0-mbstring php7.0-xml php7.0-bcmath php7.0-zip php7.0-curl php7.0-gd

# Install PHP 7.1:
sudo apt install php7.1 php7.1-fpm php7.1-mysql php7.1-mbstring php7.1-xml php7.1-bcmath php7.1-zip php7.1-curl php7.1-gd

# Install PHP 7.2:
sudo apt install php7.2 php7.2-fpm php7.2-mysql php7.2-mbstring php7.2-xml php7.2-bcmath php7.2-zip php7.2-curl php7.2-gd

# Install PHP 7.3:
sudo apt install php7.3 php7.3-fpm php7.3-mysql php7.3-mbstring php7.3-xml php7.3-bcmath php7.3-zip php7.3-curl php7.3-gd

# Install PHP 7.4:
sudo apt install php7.4 php7.4-fpm php7.4-mysql php7.4-mbstring php7.4-xml php7.4-bcmath php7.4-zip php7.4-curl php7.4-gd

# Install PHP 8.0:
sudo apt install php8.0 php8.0-fpm php8.0-mysql php8.0-mbstring php8.0-xml php8.0-bcmath php8.0-zip php8.0-curl php8.0-gd

# Install PHP 8.1:
sudo apt install php8.1 php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-xml php8.1-bcmath php8.1-zip php8.1-curl php8.1-gd

# Install PHP 8.2:
sudo apt install php8.2 php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-bcmath php8.2-zip php8.2-curl php8.2-gd

# Install PHP 8.3:
sudo apt install php8.3 php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-bcmath php8.3-zip php8.3-curl php8.3-gd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To change the PHP version used by the CLI, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo update-alternatives --set php /usr/bin/php5.6
sudo update-alternatives --set php /usr/bin/php7.0
sudo update-alternatives --set php /usr/bin/php7.1
sudo update-alternatives --set php /usr/bin/php7.2
sudo update-alternatives --set php /usr/bin/php7.3
sudo update-alternatives --set php /usr/bin/php7.4
sudo update-alternatives --set php /usr/bin/php8.0
sudo update-alternatives --set php /usr/bin/php8.1
sudo update-alternatives --set php /usr/bin/php8.2
sudo update-alternatives --set php /usr/bin/php8.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see and select the installed and active PHP versions interactively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo update-alternatives --config php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To confirm the updated version of PHP used by the CLI, run $ &lt;code&gt;php -v&lt;/code&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5i0cqhfu2vmwdrjbtp6c.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%2F5i0cqhfu2vmwdrjbtp6c.png" alt="Image description" width="790" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Start, stop or restart the services each PHP versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Start the services for each PHP version:
sudo service php5.6-fpm start
sudo service php7.0-fpm start
sudo service php7.1-fpm start
sudo service php7.2-fpm start
sudo service php7.3-fpm start
sudo service php7.4-fpm start
sudo service php8.0-fpm start
sudo service php8.1-fpm start
sudo service php8.2-fpm start
sudo service php8.3-fpm start

# Stop the services for each PHP version:
sudo service php5.6-fpm stop
sudo service php7.0-fpm stop
sudo service php7.1-fpm stop
sudo service php7.2-fpm stop
sudo service php7.3-fpm stop
sudo service php7.4-fpm stop
sudo service php8.0-fpm stop
sudo service php8.1-fpm stop
sudo service php8.2-fpm stop
sudo service php8.3-fpm restart

# Restart the services for each PHP version:
sudo service php5.6-fpm restart
sudo service php7.0-fpm restart
sudo service php7.1-fpm restart
sudo service php7.2-fpm restart
sudo service php7.3-fpm restart
sudo service php7.4-fpm restart
sudo service php8.0-fpm restart
sudo service php8.1-fpm restart
sudo service php8.2-fpm restart
sudo service php8.3-fpm restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go to your Nginx' virtual hosts directory (&lt;code&gt;/etc/nginx/sites-available&lt;/code&gt;) and create three virtual host configuration files for your &lt;strong&gt;laravel&lt;/strong&gt;, &lt;strong&gt;todo&lt;/strong&gt; and &lt;strong&gt;blog&lt;/strong&gt; Laravel applications:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;cd /etc/nginx/sites-available&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo vim laravel.conf&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo vim todo.conf&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo vim blog.conf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Save the following &lt;a href="https://laravel.com/docs/5.8/deployment#server-configuration" rel="noopener noreferrer"&gt;recommended Nginx configuration for Laravel&lt;/a&gt; for each files, updating only the &lt;code&gt;server_name&lt;/code&gt;, &lt;code&gt;root&lt;/code&gt; and &lt;code&gt;fastcgi_pass&lt;/code&gt; variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
    listen 80;

    # UPDATE BELOW: Use appropriate server_name for each Laravel application.
    server_name laravel.local;
    #server_name todo.local;
    #server_name blog.local;

    # UPDATE BELOW: Use appropriate root directory for each Laravel application.
    root /home/joserizal/codes/laravel/public;
    #root /home/joserizal/codes/todo/public;
    #root /home/joserizal/codes/blog/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        # UPDATE BELOW: Use appropriate PHP version.
        # For example, to use PHP 5.6, replace php8.1-fpm to php5.6-fpm.
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        # The available PHP versions are php5.6, php7.0, php7.1, php7.2, php7.3, php7.4, php8.0 and php8.1.

        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To activate the new virtual host configuration files, create symbolic links to &lt;code&gt;laravel&lt;/code&gt;, &lt;code&gt;todo&lt;/code&gt; and &lt;code&gt;blog&lt;/code&gt; in &lt;code&gt;sites-enabled&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;sudo ln -s /etc/nginx/sites-available/laravel.conf /etc/nginx/sites-enabled/&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo ln -s /etc/nginx/sites-available/todo.conf /etc/nginx/sites-enabled/&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo ln -s /etc/nginx/sites-available/blog.conf /etc/nginx/sites-enabled/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Test Nginx for errors then restart:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;sudo nginx -t&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;sudo service nginx restart&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add the three new domains to Windows' &lt;code&gt;C:\Windows\System32\drivers\etc\hosts&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1 laravel.local
127.0.0.1 todo.local
127.0.0.1 blog.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a browser, we can visit our new Laravel applications:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://laravel.local" rel="noopener noreferrer"&gt;http://laravel.local&lt;/a&gt;&lt;br&gt;
&lt;a href="http://todo.local" rel="noopener noreferrer"&gt;http://todo.local&lt;/a&gt;&lt;br&gt;
&lt;a href="http://blog.local" rel="noopener noreferrer"&gt;http://blog.local&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%2F4kwnmrwh3qllri6vtr2x.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%2F4kwnmrwh3qllri6vtr2x.png" alt="Image description" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Potential Nginx Errors and Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;To resolve the error &lt;code&gt;File not found&lt;/code&gt; and &lt;code&gt;HTTP Error 500&lt;/code&gt; when accessing the site in the browser, and the error logged by Nginx at &lt;code&gt;/var/log/nginx/error.log&lt;/code&gt;, &lt;code&gt;stat() "/home/joserizal/laravel/public/" failed (13: Permission denied)&lt;/code&gt;, make sure that &lt;a href="https://stackoverflow.com/a/43686446/3936053" rel="noopener noreferrer"&gt;Nginx has the proper permission to the project root directories&lt;/a&gt;:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  IX. Extras
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Open a Laravel application source code in Visual Studio Code
&lt;/h3&gt;

&lt;p&gt;Open an Ubuntu tab in Windows Terminal.&lt;/p&gt;

&lt;p&gt;To open the current directory in Visual Studio Code, run:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;code .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To open a specific file in Visual Studio Code, run:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;code FILENAME.TXT&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Open a Laravel application source code in Sublime Text 3/4.
&lt;/h3&gt;

&lt;p&gt;Sublime Text does not support opening directories inside WSL yet. To be able to do so, we need to do a little configuration.&lt;/p&gt;

&lt;p&gt;First, add the following block of code below to your Bash configuration file (&lt;code&gt;~/.bashrc&lt;/code&gt;, &lt;code&gt;~/.bash_profile&lt;/code&gt; or &lt;code&gt;~/.zshrc&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alias subl='"/mnt/c/Program Files/Sublime Text 3/subl.exe"'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Windows Terminal after reloading your Bash script:&lt;br&gt;
$ &lt;code&gt;source ~/.bashrc&lt;/code&gt; or&lt;br&gt;
$ &lt;code&gt;source ~/.bash_profile&lt;/code&gt; or&lt;br&gt;
$ &lt;code&gt;source ~/.zshrc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Go to a Laravel application and open the project in Sublime Text 3/4.&lt;br&gt;
$ &lt;code&gt;cd ~/codes/todo&lt;/code&gt;&lt;br&gt;
$ &lt;code&gt;subl .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To open a specific file, run:&lt;/p&gt;

&lt;p&gt;$ &lt;code&gt;subl FILENAME.TXT&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%2Fy9gi7nrje4gf2ucw34fx.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%2Fy9gi7nrje4gf2ucw34fx.png" alt="Image description" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Manage multiple LEMP services in one command:
&lt;/h3&gt;

&lt;p&gt;To create an easy-to-use command to manage our LEMP services in one command, add the following block of code below to your Bash configuration file  (&lt;code&gt;~/.bashrc&lt;/code&gt;, &lt;code&gt;~/.bash_profile&lt;/code&gt; or &lt;code&gt;~/.zshrc&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Function to start|stop|restart LEMP services in one command.
# Example: $ sudo lemp start|stop|restart
lemp() {
    echo "

 __          _______ _        
 \ \        / / ____| |       
  \ \  /\  / / (___ | |       
   \ \/  \/ / \___ \| |       
    \  /\  /  ____) | |____   
  _  \/  \/__|_____/|______|  
 | |    |  ____|  \/  |  __ \ 
 | |    | |__  | \  / | |__) |
 | |    |  __| | |\/| |  ___/ 
 | |____| |____| |  | | |     
 |______|______|_|  |_|_|     



"
    echo "WSL LEMP: $1 Nginx, MySQL and PHP for Linux (LEMP)"
    sudo service nginx "$1"
    sudo service mysql "$1"
    sudo service php5.6-fpm "$1"
    sudo service php7.0-fpm "$1"
    sudo service php7.1-fpm "$1"
    sudo service php7.2-fpm "$1"
    sudo service php7.3-fpm "$1"
    sudo service php7.4-fpm "$1"
    sudo service php8.0-fpm "$1"
    sudo service php8.1-fpm "$1"
    sudo service php8.2-fpm "$1"
    sudo service php8.3-fpm "$1"
    echo "Done..."
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To activate the new Bash configuration, reload your Bash script:&lt;br&gt;
$ &lt;code&gt;source ~/.bashrc&lt;/code&gt; or&lt;br&gt;
$ &lt;code&gt;source ~/.bash_profile&lt;/code&gt; or&lt;br&gt;
$ &lt;code&gt;source ~/.zshrc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then, restart your Windows Terminal.&lt;/p&gt;

&lt;p&gt;You may now start, stop or restart your LEMP services in one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lemp start
lemp stop
lemp restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fh2uuh7lscqdc30glke4m.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%2Fh2uuh7lscqdc30glke4m.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hurray! 🙌🎉 Enjoy Linux, Nginx, MySQL and PHP (LEMP) on your Windows PC!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>windows</category>
      <category>linux</category>
      <category>lemp</category>
    </item>
    <item>
      <title>Make Visual Studio Code Pretty</title>
      <dc:creator>Don Cadavona</dc:creator>
      <pubDate>Fri, 04 Mar 2022 03:53:05 +0000</pubDate>
      <link>https://dev.to/doncadavona/make-visual-studio-code-pretty-50j9</link>
      <guid>https://dev.to/doncadavona/make-visual-studio-code-pretty-50j9</guid>
      <description>&lt;p&gt;Save your eyes from cluttered editor. Make Visual Studio Code more pleasing to look at. This is similar to my "&lt;a href="https://dev.to/doncadavona/make-sublime-text-3-pretty-3037"&gt;Make Sublime Text 3 Pretty&lt;/a&gt;" setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F3gjw32spsurcvia1p6r7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F3gjw32spsurcvia1p6r7.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The original looks okay. But, it looks cluttered. To make it prettier, copy and save this settings to your &lt;code&gt;settings.json&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"breadcrumbs.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.fontFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fira Code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.fontLigatures"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.fontSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.lineHeight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.lineNumbers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"off"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.minimap.showSlider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"always"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.padding.bottom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.padding.top"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.wordWrap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"on"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"explorer.autoReveal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"explorer.openEditors.visible"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workbench.activityBar.visible"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workbench.colorTheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Material Theme Palenight"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workbench.statusBar.visible"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;Also, you need to install &lt;a href="https://material-theme.site/" rel="noopener noreferrer"&gt;Material Theme&lt;/a&gt; in Visual Studio Code and &lt;a href="https://github.com/tonsky/FiraCode" rel="noopener noreferrer"&gt;Fira Code&lt;/a&gt; in your Operating System.&lt;/p&gt;

</description>
      <category>visualstudiocode</category>
      <category>vscode</category>
      <category>codeeditor</category>
    </item>
    <item>
      <title>Eloquenturl: A Laravel Package to Simplify or Eliminate Query Building for URL Parameters</title>
      <dc:creator>Don Cadavona</dc:creator>
      <pubDate>Thu, 27 Jan 2022 17:50:37 +0000</pubDate>
      <link>https://dev.to/doncadavona/eloquenturl-a-laravel-package-to-simplify-or-eliminate-query-building-for-url-parameters-2iem</link>
      <guid>https://dev.to/doncadavona/eloquenturl-a-laravel-package-to-simplify-or-eliminate-query-building-for-url-parameters-2iem</guid>
      <description>&lt;p&gt;Eloquenturl is a Laravel package that &lt;strong&gt;simplifies&lt;/strong&gt; and &lt;strong&gt;eliminates&lt;/strong&gt; building of complex, cluttered and unreusable queries for filters, search, sort, scopes, pagination and more.&lt;/p&gt;

&lt;p&gt;The name "Eloquenturl", pronounced "Eloquenterl" was derived from the term "Eloquent URL". Meaning, Laravel's Eloquent models can be queried with only URL parameters.&lt;/p&gt;

&lt;p&gt;For example, you have a route &lt;code&gt;/articles&lt;/code&gt;, and wish to support filtering the index results with URL parameters, &lt;code&gt;/articles?search=apple&amp;amp;order_by=author&amp;amp;scope[published]=true&amp;amp;scope[featured]=true&lt;/code&gt;, &lt;strong&gt;without Eloquenturl&lt;/strong&gt;, your resource controller would be something 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="cp"&gt;&amp;lt;?php&lt;/span&gt;

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

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Article&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Http\Request&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;ArticlesController&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;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&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="c1"&gt;// Initialise query&lt;/span&gt;
        &lt;span class="nv"&gt;$articles_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Article&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Build the filters query&lt;/span&gt;

        &lt;span class="c1"&gt;// Filter articles by search term&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;filled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'search'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$articles_query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'like'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'%'&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'%'&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;orWhereHas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&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;$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;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'like'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'%'&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'%'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Filter articles by category&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;filled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
            &lt;span class="c1"&gt;// Validate the ordering parameters&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;$categories&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'slug'&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;toArray&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nv"&gt;$articles_query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;whereHas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&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;$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;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'slug'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;});&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Filter articles by user/author's username&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;filled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
            &lt;span class="nv"&gt;$articles_query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;whereHas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&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;$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;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;username&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;// Ugh, notice that for every field you wish to filter by,&lt;/span&gt;
        &lt;span class="c1"&gt;// you'll write code for that just like above.&lt;/span&gt;

        &lt;span class="c1"&gt;// Order articles&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;filled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'order_by'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Validate the ordering parameters&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order_by&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'published_at'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nv"&gt;$order_by&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order_by&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;filled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'order'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'asc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'desc'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nb"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'asc'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nv"&gt;$articles_query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order_by&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Set default ordering&lt;/span&gt;
            &lt;span class="nv"&gt;$articles_query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'published_at'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'desc'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Execute the query&lt;/span&gt;
        &lt;span class="nv"&gt;$articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$articles_query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'articles.index'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;compact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'articles'&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;To be fare, the code above is already well written. But,&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;Eloquenturl&lt;/code&gt;, we can make it simple, yet more powerful:&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="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Http\Controllers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Http\Controllers\Controller&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;App\Models\Article&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;Doncadavona\Eloquenturl\Eloquenturl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Http\Request&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;ArticlesController&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;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&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="c1"&gt;// Simply pass the model and the request.&lt;/span&gt;
        &lt;span class="nv"&gt;$articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Eloquenturl&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;eloquenturled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Article&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="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'articles.index'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;compact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'articles'&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;Please take a look at the &lt;a href="https://github.com/doncadavona/eloquenturl"&gt;Github Repository&lt;/a&gt; for installation, usage guides and more details:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/doncadavona/eloquenturl"&gt;https://github.com/doncadavona/eloquenturl&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;Eloquenturl is developed by &lt;a href="https://doncadavona.com"&gt;Don Cadavona&lt;/a&gt; with love.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>package</category>
      <category>query</category>
    </item>
    <item>
      <title>Make Sublime Text 3/4 Pretty</title>
      <dc:creator>Don Cadavona</dc:creator>
      <pubDate>Sat, 18 Jul 2020 19:10:50 +0000</pubDate>
      <link>https://dev.to/doncadavona/make-sublime-text-3-pretty-3037</link>
      <guid>https://dev.to/doncadavona/make-sublime-text-3-pretty-3037</guid>
      <description>&lt;p&gt;Here's my pretty Sublime Text 3:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsa7zrrqsok750s4bo6q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsa7zrrqsok750s4bo6q7.png" alt="Alt Text" width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It looks clean. No status bars, no line numbers, big, readable codes and iconography, and, still has the Sidebar and Minimap which is what made Sublime Text awesome.&lt;/p&gt;

&lt;p&gt;My take here is, your editor is your canvas, not a pilot's cockpit. You are creating something. You're not driving a plane. Remove distractions, take your Zen a step deeper!&lt;/p&gt;

&lt;p&gt;Here's the default Sublime Text 3:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm72cpzc7511mr1vrz0e4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm72cpzc7511mr1vrz0e4.png" alt="Alt Text" width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First of all, if you're coming from editors like Notepad++, (&lt;em&gt;Ugh, those were the days...&lt;/em&gt;) Sublime Text 3 already looks nice out-of-the-box by design. Read design story here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.pixelstech.net/article/1379865910-The-story-behind-Sublime-Text"&gt;https://www.pixelstech.net/article/1379865910-The-story-behind-Sublime-Text&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;Make yours pretty too:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Install Package Control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;code&gt;Preferences -&amp;gt; Install Package Control&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Install Material Theme&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install &lt;code&gt;Material Theme&lt;/code&gt; via &lt;code&gt;Package Control&lt;/code&gt;, activate then pick your favorite color. I like &lt;code&gt;Palenight&lt;/code&gt;, it's light on my eyes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Install Fira Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tonsky/FiraCode"&gt;Fira Code&lt;/a&gt; is my favorite code font, download and install it on your system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Update Settings&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hide Status Bar: &lt;code&gt;View -&amp;gt; Hide Status Bar&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Add settings (&lt;code&gt;Cmd + ,&lt;/code&gt; in Mac or &lt;code&gt;Ctrl + ,&lt;/code&gt; in Windows):&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"color_scheme": "Packages/Material Theme/schemes/Material-Theme-Palenight.tmTheme",&lt;br&gt;
"theme": "Material-Theme-Palenight.sublime-theme",&lt;br&gt;
"font_face": "Fira Code",&lt;br&gt;
"font_size": 14,&lt;br&gt;
"line_numbers": false&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Done&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Pretty, simple!&lt;/p&gt;

</description>
      <category>sublimetext3</category>
      <category>sublimetext</category>
      <category>codeeditor</category>
    </item>
  </channel>
</rss>
