<?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: Titas Gailius</title>
    <description>The latest articles on Forem by Titas Gailius (@titasgailius).</description>
    <link>https://forem.com/titasgailius</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%2F98351%2F84f04d1f-1297-439e-9c99-d162e55dc0da.jpg</url>
      <title>Forem: Titas Gailius</title>
      <link>https://forem.com/titasgailius</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/titasgailius"/>
    <language>en</language>
    <item>
      <title>Roll your own Request object in Laravel</title>
      <dc:creator>Titas Gailius</dc:creator>
      <pubDate>Thu, 31 Dec 2020 12:50:00 +0000</pubDate>
      <link>https://forem.com/titasgailius/custom-request-object-in-laravel-39pi</link>
      <guid>https://forem.com/titasgailius/custom-request-object-in-laravel-39pi</guid>
      <description>&lt;p&gt;There are multiple ways to extend or modify the &lt;code&gt;Request&lt;/code&gt; object in Laravel. I'd like to show you a method, which in my opinion is the cleanest one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Macro
&lt;/h2&gt;

&lt;p&gt;You may already know about the &lt;code&gt;macro&lt;/code&gt; method. It's the most obvious way to introduce new methods to the &lt;code&gt;Request&lt;/code&gt; object but it has some downsides.&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;Request&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;macro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'project'&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="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;user&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;This solution is simple but it has some flaws:&lt;/p&gt;

&lt;p&gt;• You cannot override or change existing methods.&lt;br&gt;
• It's not obvious where these new methods are coming from.&lt;br&gt;
• No IDE autocompletion.&lt;/p&gt;


&lt;h2&gt;
  
  
  Custom Request Object
&lt;/h2&gt;

&lt;p&gt;I like creating my own &lt;code&gt;Request&lt;/code&gt; object.&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&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="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;LaravelRequest&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;Request&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;LaravelRequest&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cd"&gt;/**
     * Get the team making the request.
     *
     * @param  string|null  $guard
     * @return mixed
     */&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;team&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$guard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&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="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$guard&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;It's simple, clean and straightforward. Much better than introducing new methods via "macros".&lt;/p&gt;




&lt;p&gt;Now, we need to instruct Laravel to use this new custom class as a base.&lt;/p&gt;

&lt;p&gt;Simply override the &lt;code&gt;handle&lt;/code&gt; method in our &lt;code&gt;App\Http\Kernel&lt;/code&gt; class to use your custom &lt;code&gt;Request&lt;/code&gt; object.&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&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\Request&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\Foundation\Http\Kernel&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;HttpKernel&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;Kernel&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;HttpKernel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * Handle an incoming HTTP request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */&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;handle&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;createFrom&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;... and finally, alias your new &lt;code&gt;App\Http\Request&lt;/code&gt; class so the container always returns the same instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$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;alias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'request'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Request&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;h1&gt;
  
  
  Happy Coding!
&lt;/h1&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>request</category>
    </item>
    <item>
      <title>Multi-stage Docker Builds for Laravel</title>
      <dc:creator>Titas Gailius</dc:creator>
      <pubDate>Mon, 07 Sep 2020 15:19:17 +0000</pubDate>
      <link>https://forem.com/titasgailius/multi-stage-docker-builds-for-laravel-c86</link>
      <guid>https://forem.com/titasgailius/multi-stage-docker-builds-for-laravel-c86</guid>
      <description>&lt;p&gt;Most applications have a build step to download all the dependencies and/or compile your frontend assets.&lt;/p&gt;

&lt;p&gt;Usually, it takes most of the deployment time.&lt;/p&gt;

&lt;p&gt;Not to mention that the final image may be bigger because of the unnecessary dependencies that were used to download dependencies and compile the frontend assets.&lt;/p&gt;

&lt;h1&gt;
  
  
  Docker multi-stage builds
&lt;/h1&gt;

&lt;p&gt;One of the easiest ways to make your deployments faster and images slimmer is to use multi-stage docker builds.&lt;/p&gt;

&lt;p&gt;Docker caches a specific stage and only re-runs it if any of the dependent files have been changed.&lt;/p&gt;

&lt;h1&gt;
  
  
  Composer Step
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Use Composer 2.0 image.&lt;/li&gt;
&lt;li&gt;Copy files required for "composer install".&lt;/li&gt;
&lt;li&gt;Run "composer install".&lt;/li&gt;
&lt;li&gt;Copy the rest of the files.&lt;/li&gt;
&lt;li&gt;Run "composer dump-autoload".
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# PHP Dependencies&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; composer:2.0 as vendor&lt;/span&gt;

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

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; database/ database/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; composer.json composer.json&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; composer.lock composer.lock&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;composer &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nt"&gt;--no-interaction&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nt"&gt;--no-plugins&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nt"&gt;--no-scripts&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nt"&gt;--no-dev&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nt"&gt;--prefer-dist&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;composer dump-autoload
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  NPM Step
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Use NodeJS image.&lt;/li&gt;
&lt;li&gt;Cop files required for the "npm install".&lt;/li&gt;
&lt;li&gt;Run "npm install".&lt;/li&gt;
&lt;li&gt;Copy files required to build your frontend assets.&lt;/li&gt;
&lt;li&gt;Build your frontend assets.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# Frontend&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:14.9 as frontend&lt;/span&gt;

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

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; artisan package.json webpack.mix.js yarn.lock tailwind.js ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; resources/js ./resources/js&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; resources/sass ./resources/sass&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm run production
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Application Step
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Use your desired image.&lt;/li&gt;
&lt;li&gt;Copy built files from the previous stages.&lt;/li&gt;
&lt;li&gt;Enjoy fast deployments.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# Application&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:7.4-fpm&lt;/span&gt;

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

&lt;span class="c"&gt;# Install PHP dependencies&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; libxml2-dev
&lt;span class="k"&gt;RUN &lt;/span&gt;docker-php-ext-install pdo pdo_mysql mbstring opcache tokenizer xml ctype json bcmath pcntl

&lt;span class="c"&gt;# Copy Frontend build&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=frontend /app/node_modules/ ./node_modules/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=frontend /app/public/js/ ./public/js/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=frontend /app/public/css/ ./public/css/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=frontend /app/public/mix-manifest.json ./public/mix-manifest.json&lt;/span&gt;

&lt;span class="c"&gt;# Copy Composer dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=vendor /app/vendor/ ./vendor/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;php artisan config:cache
&lt;span class="k"&gt;RUN &lt;/span&gt;php artisan route:cache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You may find the full &lt;code&gt;Dockerfile&lt;/code&gt; used in this article &lt;a href="https://gist.github.com/TitasGailius/1f6ce9045938299ab53f608236839eac"&gt;here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Laravel Moonlight</title>
      <dc:creator>Titas Gailius</dc:creator>
      <pubDate>Mon, 13 Apr 2020 11:48:07 +0000</pubDate>
      <link>https://forem.com/titasgailius/laravel-moonlight-3dao</link>
      <guid>https://forem.com/titasgailius/laravel-moonlight-3dao</guid>
      <description>&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%2Fi%2Fcbrw6o58f3yul88ixj47.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%2Fi%2Fcbrw6o58f3yul88ixj47.jpg" alt="Laravel Moonlight"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TitasGailius/laravel-moonlight" rel="noopener noreferrer"&gt;Laravel Moonlight&lt;/a&gt; is a carefully crafted Laravel preset.&lt;/p&gt;

&lt;p&gt;The goal of this preset is to provide an elegant scaffolding for your next single-page application.&lt;/p&gt;




&lt;h1&gt;
  
  
  Stack
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;VueJS&lt;/li&gt;
&lt;li&gt;InertiaJS&lt;/li&gt;
&lt;li&gt;TailwindCSS&lt;/li&gt;
&lt;li&gt;Ziggy (Use named routes from your JS)&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;

&lt;p&gt;You may generate a basic scaffolding running this artisan command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan ui moonlight
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Laravel Moonlight comes with a full-featured authentication scaffolding. You may include the authentication scaffolding by adding the &lt;code&gt;--auth&lt;/code&gt; option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan ui moonlight &lt;span class="nt"&gt;--auth&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authentication scaffolding comes with these views:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login&lt;/li&gt;
&lt;li&gt;Register&lt;/li&gt;
&lt;li&gt;Resend verification email&lt;/li&gt;
&lt;li&gt;Reset password&lt;/li&gt;
&lt;li&gt;Confirm new password (after password reset)&lt;/li&gt;
&lt;li&gt;Confirm password (just like when GitHub asks to confirm your password for certain actions)&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Routes
&lt;/h1&gt;

&lt;p&gt;You may use Laravel named routes straight from your Vue components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;a :href="$route('login')"&amp;gt;Login&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;$route&lt;/code&gt; helper is powered by &lt;a href="https://github.com/tightenco/ziggy" rel="noopener noreferrer"&gt;Ziggy&lt;/a&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Authenticated User
&lt;/h1&gt;

&lt;p&gt;Every page has access to the authenticated user through a prop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Object&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;Alternatively, you may access the authenticated user through a global variable: &lt;code&gt;$page.user&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello, {{ $page.user.name }}&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Validation Errors
&lt;/h1&gt;

&lt;p&gt;Just like the authenticated user, you may access the validation errors through a prop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Object&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;Alternatively, you may access the validation errors through a global variable: &lt;code&gt;$page.errors&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-error"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ $page.errors.email[0] }}&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;h1&gt;
  
  
  Screenshots
&lt;/h1&gt;

&lt;p&gt;Lastly, here are a few screenshots with the views that are included with this preset. You may find more on the GitHub repo.&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%2Fraw.githubusercontent.com%2FTitasGailius%2Flaravel-moonlight%2Fmaster%2Fscreenshots%2Fsignup.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%2Fraw.githubusercontent.com%2FTitasGailius%2Flaravel-moonlight%2Fmaster%2Fscreenshots%2Fsignup.png" alt="GitHub Logo"&gt;&lt;/a&gt;&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%2Fraw.githubusercontent.com%2FTitasGailius%2Flaravel-moonlight%2Fmaster%2Fscreenshots%2Femail.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%2Fraw.githubusercontent.com%2FTitasGailius%2Flaravel-moonlight%2Fmaster%2Fscreenshots%2Femail.png" alt="GitHub Logo"&gt;&lt;/a&gt;&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%2Fraw.githubusercontent.com%2FTitasGailius%2Flaravel-moonlight%2Fmaster%2Fscreenshots%2Fconfirm.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%2Fraw.githubusercontent.com%2FTitasGailius%2Flaravel-moonlight%2Fmaster%2Fscreenshots%2Fconfirm.png" alt="GitHub Logo"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Feel free to check out full documentation at &lt;a href="https://github.com/TitasGailius/laravel-moonlight" rel="noopener noreferrer"&gt;https://github.com/TitasGailius/laravel-moonlight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback is more than welcome!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>tailwindcss</category>
      <category>inertiajs</category>
      <category>vue</category>
    </item>
    <item>
      <title>Introducing Terminal</title>
      <dc:creator>Titas Gailius</dc:creator>
      <pubDate>Sun, 22 Mar 2020 12:25:29 +0000</pubDate>
      <link>https://forem.com/titasgailius/introducing-terminal-2kme</link>
      <guid>https://forem.com/titasgailius/introducing-terminal-2kme</guid>
      <description>

&lt;h1&gt;
  
  
  Terminal
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aMWcv4aT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j5glx07tsyxlqiwq3iem.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aMWcv4aT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j5glx07tsyxlqiwq3iem.png" alt="Preview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An elegant wrapper around Symfony's Process component.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;I've been developing hosting related services for almost 4 years now. &lt;/p&gt;

&lt;p&gt;To complete various tasks, I have to write PHP code that executes bash scripts almost on a daily basis. Let's say you want to set up automatic updates for WordPress or put your site to the maintenance mode.&lt;/p&gt;

&lt;p&gt;That's where Terminal comes in handy.&lt;/p&gt;




&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;To activate "maintenance mode" in WordPress, you might need to execute this wp-cli command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ wp maintenance-mode activate
Enabling Maintenance mode...
Success: Activated Maintenance mode.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now, with the Terminal, you can do this straight from your PHP script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nx"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'wp maintenance-mode activate'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;h3&gt;
  
  
  More
&lt;/h3&gt;

&lt;p&gt;You can even setup timeout, retries, change the current working directory and much more:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nx"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storage_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'sites/123'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'wp maintenance-mode activate'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;h3&gt;
  
  
  Extending
&lt;/h3&gt;

&lt;p&gt;Another cool feature of the Terminal is that you can easily define your custom commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nx"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'maintenanceOn'&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;$terminal&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="nv"&gt;$terminal&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'wp maintenance-mode activate'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;maintenanceOn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;h3&gt;
  
  
  Testing
&lt;/h3&gt;

&lt;p&gt;It gets even better.&lt;br&gt;
Terminal comes with a bunch of beautiful testing utilities that help you write simple and expressive tests for your application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nx"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'wp maintenance-mode activate'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;assertExecuted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$command&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;p&gt;Feel free to check out full documentation at &lt;a href="https://github.com/TitasGailius/terminal"&gt;https://github.com/TitasGailius/terminal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback is more than welcome!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>symfony</category>
      <category>bash</category>
      <category>php</category>
    </item>
    <item>
      <title>Building HTTP clients with Guzzle</title>
      <dc:creator>Titas Gailius</dc:creator>
      <pubDate>Tue, 04 Sep 2018 14:34:19 +0000</pubDate>
      <link>https://forem.com/titasgailius/building-http-clients-withguzzle-d5e</link>
      <guid>https://forem.com/titasgailius/building-http-clients-withguzzle-d5e</guid>
      <description>&lt;p&gt;Whenever you integrate some external service that exposes an HTTP API you'll end up writting a client to interact with that service.&lt;/p&gt;

&lt;p&gt;There're many different ways to build these http clients although the 3 most common approaches I encountered are listed below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Creating a client class that extends guzzle.&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6gldkg0i8capgxxlj4jk.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%2F6gldkg0i8capgxxlj4jk.png" alt="extends guzzle" width="800" height="711"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Creating a client class that handles all the logic and calls guzzle.&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9ipqrxiccuapsgthqwy.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%2Fs9ipqrxiccuapsgthqwy.png" alt="extends guzzle" width="800" height="994"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Creating a client class where all the logic is handled by guzzle middleware.&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb8joc9tbarv337nkinvk.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%2Fb8joc9tbarv337nkinvk.png" alt="extends guzzle" width="800" height="1026"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Which one do you prefer? Do you have any alternatives? Discuss.
&lt;/h1&gt;

</description>
      <category>php</category>
      <category>guzzle</category>
      <category>sdk</category>
      <category>client</category>
    </item>
  </channel>
</rss>
