<?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: Chris Arter</title>
    <description>The latest articles on Forem by Chris Arter (@christopherarter).</description>
    <link>https://forem.com/christopherarter</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%2F165523%2Ff9f57411-3bed-43d6-b955-9ec93b37b6d8.jpg</url>
      <title>Forem: Chris Arter</title>
      <link>https://forem.com/christopherarter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/christopherarter"/>
    <language>en</language>
    <item>
      <title>How to Comment Your Code Like a Boss</title>
      <dc:creator>Chris Arter</dc:creator>
      <pubDate>Thu, 03 Dec 2020 12:18:44 +0000</pubDate>
      <link>https://forem.com/christopherarter/how-to-comment-your-code-like-a-boss-5a20</link>
      <guid>https://forem.com/christopherarter/how-to-comment-your-code-like-a-boss-5a20</guid>
      <description>&lt;p&gt;Comments are like garlic.&lt;/p&gt;

&lt;p&gt;They can push a dish over the top. Or, they can relegate it to the polite pile of leftovers that your guests appreciate but didn't enjoy.&lt;/p&gt;

&lt;p&gt;Comments in your code are much the same. Good, clear, and necessary comments can help keep an otherwise convoluted narrative of code become a clear, easy-to-follow story.&lt;/p&gt;

&lt;p&gt;The two main ideas that have helped me when deciding if a section of code needs comments, or if I should leave it bare are these:&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Code should explain &lt;em&gt;what&lt;/em&gt; is happening.
&lt;/h3&gt;

&lt;p&gt;A true gem from Uncle Bob's &lt;em&gt;Clean Code&lt;/em&gt; is the chapter on naming. Explicit and clear naming will help make your code be clear and easy to follow.&lt;/p&gt;

&lt;p&gt;Instead of this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// get the length of an array
const gl = a =&amp;gt; a.length
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We write this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const getArrayLength = a =&amp;gt; a.length
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows us to write code that is expressive. The code itself tells you what is happening. In the simple example above, the name of the function tells you what it does. There is no need to parrot this in a comment above. Each time you write a comment, you add to the mental overhead of trying to parse not only the code, but the comments as well. This is why comments should be limited &amp;amp; meaningful.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Comments should explain &lt;em&gt;why&lt;/em&gt;.
&lt;/h3&gt;

&lt;p&gt;Let's say we have a user base that is split between two databases. A client or product has users from an old system, a new system, and our application needs to manage both while we transition the code base to a new platform.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import oldsdk from 'old-sdk';
import newsdk from 'new-sdk';

const getUserByEmail = async email =&amp;gt; {

    // we switched identity providers
    // and not all users are migrated yet.
    const oldUserData = await oldsdk.getUserByEmail(email);
    const newUserData = await newsdk.getUserByEmail(email);
    return newUserData || oldUserData;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we are fetching a user from some API using a new SDK, and an old SDK. Stuff like this happens &lt;em&gt;all the time&lt;/em&gt;. For someone reading this code, while the variable names are descriptive, we don't know &lt;em&gt;why&lt;/em&gt; this is happening. The comments in this code explains the &lt;em&gt;purpose&lt;/em&gt; of this code. The &lt;em&gt;what&lt;/em&gt; is still clear.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;Like many things, this is not a hard and fast rule. In fact, it's not even a rule, but more like a tool. It's a generalized guidepost that has been helpful for me in my career as a barometer for writing good comments. There are plenty of situations where you would want or need to approach things differently, but this tip can be a great starting point when getting a feel for writing comments.&lt;/p&gt;

&lt;p&gt;Happy coding! &lt;/p&gt;

</description>
      <category>juniordev</category>
      <category>cleancode</category>
      <category>es6</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to easily test REST endpoints in Laravel with minimal syntax.</title>
      <dc:creator>Chris Arter</dc:creator>
      <pubDate>Sat, 09 May 2020 12:46:59 +0000</pubDate>
      <link>https://forem.com/christopherarter/how-to-easily-test-rest-endpoints-in-laravel-with-minimal-syntax-ep5</link>
      <guid>https://forem.com/christopherarter/how-to-easily-test-rest-endpoints-in-laravel-with-minimal-syntax-ep5</guid>
      <description>&lt;p&gt;When I write unit tests for APIs, I try to write tests that are as flexible and durable as possible. I try my best to avoid brittle tests that may break if some implementation in my code base should change.&lt;/p&gt;

&lt;p&gt;Ideally, tests should not care at all about the implementation, and only care that with X input, we get Y output. Some of your endpoints may return Laravel API Resources. I've seen some developers write tests that ensure that the resource is returned compared to a given shape / array. But, we don't really care about that, do we? We may change our API Resource class, but we want our test to stay resilient.&lt;/p&gt;

&lt;p&gt;In the example image above, we'll say we only really care that the title and content of a post is included in the API response. Other fields may change in our resource, but this test ensures that those two fields are always contained in the response.&lt;/p&gt;

&lt;p&gt;This is best achieved by using assertJsonFragment. You may have used &lt;code&gt;assertJson()&lt;/code&gt; before, but since we are interested in creating as durable tests as possible, &lt;code&gt;assertJsonFragment&lt;/code&gt; ensures the tests won't fail if the shape of our returned response changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arter.dev/posts/quick-tip-how-to-easily-test-rest-endpoints-with-minimal-syntax/"&gt;Continue reading&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>tdd</category>
    </item>
    <item>
      <title>A no-fuss Laravel + Docker starter repo</title>
      <dc:creator>Chris Arter</dc:creator>
      <pubDate>Thu, 26 Sep 2019 10:48:19 +0000</pubDate>
      <link>https://forem.com/christopherarter/a-no-fuss-laravel-docker-starter-repo-2and</link>
      <guid>https://forem.com/christopherarter/a-no-fuss-laravel-docker-starter-repo-2and</guid>
      <description>&lt;p&gt;This starter repo was born out of frustration of getting docker working with Laravel. Hopefully this will save you some headache!&lt;/p&gt;

&lt;p&gt;First, clone the repo here: &lt;a href="https://github.com/christopherarter/Quick-Laravel-Docker-Starter"&gt;https://github.com/christopherarter/Quick-Laravel-Docker-Starter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prerequisites:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;PHP 7.1 (minimum)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composer&lt;/strong&gt; &lt;a href="https://getcomposer.org/doc/00-intro.md"&gt;install guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; &lt;a href="https://docs.docker.com/v17.09/engine/installation/"&gt;install guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose&lt;/strong&gt; &lt;a href="https://docs.docker.com/compose/install/"&gt;install guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Get started
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Clone this repo and navigate to the repo folder. Run &lt;code&gt;composer create-project --prefer-dist laravel/laravel my-app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;mv my-app/* my-app/.* ./ &amp;amp;&amp;amp; rm -rf my-app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change the values in your &lt;code&gt;.env&lt;/code&gt; to the values below:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_CONNECTION=mysql
DB_HOST=laravel_db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel_user
DB_PASSWORD=myStrongPassword1234
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The last step, run &lt;code&gt;docker-compose up&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When you run &lt;code&gt;docker ps&lt;/code&gt;, you should see your service running locally at &lt;code&gt;http://localhost:9000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To run migrations and commands that interact with the database&lt;/strong&gt; you need to be inside the laravel web app container. &lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;docker ps&lt;/code&gt; and get the id of the laravel web container. Next, run &lt;code&gt;docker exec -it &amp;lt;container-id&amp;gt; /bin/bash&lt;/code&gt; and you should be at &lt;code&gt;/var/www/app&lt;/code&gt;. You may now run artisan commands to interact with the database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting to your database with a database tool
&lt;/h3&gt;

&lt;p&gt;To connect with this database using tools like MySQL Workbench, DB Beaver or TablePlus, you can access it with the &lt;code&gt;3305&lt;/code&gt; port, username and password you specified in your &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Middleware for Wordpress</title>
      <dc:creator>Chris Arter</dc:creator>
      <pubDate>Mon, 15 Jul 2019 02:36:06 +0000</pubDate>
      <link>https://forem.com/christopherarter/middleware-for-wordpress-g4k</link>
      <guid>https://forem.com/christopherarter/middleware-for-wordpress-g4k</guid>
      <description>&lt;p&gt;When I originally began doing significant development around the Wordpress REST API, I was excited to finally get hands-on with it. &lt;/p&gt;

&lt;p&gt;Then, it came to write "middleware". If you are unfamiliar with middleware in web development, it is simply a series of checks between the inbound request and your controller actions.&lt;/p&gt;

&lt;p&gt;This is the way you can perform middleware checks according to the current WP Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="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="nx"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'rest_api_init'&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="nx"&gt;register_rest_route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'myplugin/v1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/author/(?P&amp;lt;id&amp;gt;\d+)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'methods'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'my_awesome_func'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'args'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s1"&gt;'id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'validate_callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'is_numeric'&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'permission_callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nx"&gt;current_user_can&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'edit_others_posts'&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;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;All we're left with is &lt;code&gt;permission_callback&lt;/code&gt; to pass in a function string, or closure as seen in the documentation.&lt;/p&gt;

&lt;p&gt;I decided to dig into the source code and see if I could create a more familiar looking middleware.&lt;/p&gt;

&lt;h3&gt;
  
  
  WP Middleware
&lt;/h3&gt;

&lt;p&gt;That's when I created a &lt;code&gt;middleware()&lt;/code&gt; helper.&lt;/p&gt;

&lt;p&gt;This helper simply takes the &lt;code&gt;WP_REST_Request&lt;/code&gt; from the &lt;code&gt;rest_pre_dispatch&lt;/code&gt; filter and injects it as a parameter into the callback in the &lt;code&gt;rest_pre_dispatch&lt;/code&gt; hook.&lt;/p&gt;

&lt;p&gt;This allows you to write simple checks, with all of the objects you need all in one place:&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;middleware&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/wp/v2/posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'check_foo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'check_bar'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// callback check&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;check_foo&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;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="na"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'foo'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;'foo'&lt;/span&gt; &lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;reject&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;// callback check&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;check_bar&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;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="na"&gt;get_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'bar'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;'bar'&lt;/span&gt; &lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;reject&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;Simply return the &lt;code&gt;reject()&lt;/code&gt; function to reject the request and return a &lt;code&gt;401&lt;/code&gt;. You can also pass custom rejection messages and response code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"foo doesn't equal bar!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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



&lt;h3&gt;
  
  
  Authorization
&lt;/h3&gt;

&lt;p&gt;This also opens the door to allow for certain API operations based on external sources, e.g. using user tokens from Cognito, or approving or denying requests based on other token data in the request, like Stripe.&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;middleware&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;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/wp/v2/stripe-webhook'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'stripe_check'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;stripe_check&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="c1"&gt;// verify the webhook came from stripe&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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



&lt;h3&gt;
  
  
  Middleware Stacks
&lt;/h3&gt;

&lt;p&gt;This also allows you to create pre-described middleware stacks that allow for portable, consolidated check logic across 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="nv"&gt;$middlewareStack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'check_foo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'check_bar'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;middleware&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;guard&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'/wp/v2/posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'/wp/v2/users'&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; 
    &lt;span class="nv"&gt;$middlewareStack&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;p&gt;For documentation, see the &lt;a href="https://github.com/christopherarter/WP-Middleware-Plugin/blob/master/readme.md"&gt;ReadMe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To install this middleware as a plugin, use &lt;a href="https://github.com/christopherarter/WP-Middleware-Plugin"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install via composer:&lt;br&gt;
&lt;code&gt;composer require christopherarter/wp-middleware&lt;/code&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>php</category>
    </item>
  </channel>
</rss>
