Yesterday I was working on a project in Radar and needed to create a command line tool for it.
In the past, I’ve always used Symfony Console which I like. Since my application was already built using Radar and adhering to Action-Domain-Responder and Clean Architecture, I wanted a solution that was more consistent with the rest of the codebase.
The selling point to Clean Architecture is that your domain logic is separate from the delivery mechanism. So if Radar was my delivery mechanism, I should be able to have a different command line delivery mechanism and my domain shouldn’t know or care.
I took a look at Aura.Cli which seems nice. However, it’s very much a command line library. Out of the box, it’s not a framework for building command line tools adhering to ADR.
So I took a stab at writing one (that uses Aura.Cli), it’s called Cadre.CliAdr.
At this point, it’s more of a proof of concept rather than a production solution. It’s heavily based on Radar and uses the same patterns.
Here is an example of how you’d use it. It will seem very familiar if you’ve used Radar.
<span class="token keyword">use</span> <span class="token package">Aura<span class="token punctuation">\</span>Di<span class="token punctuation">\</span>ContainerBuilder</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Aura<span class="token punctuation">\</span>Cli<span class="token punctuation">\</span>CliFactory</span><span class="token punctuation">;</span>
<span class="token keyword">require</span> <span class="token constant">__DIR__</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'/../vendor/autoload.php'</span><span class="token punctuation">;</span>
<span class="token variable">$di</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ContainerBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token operator">-></span><span class="token function">newConfiguredInstance</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$adr</span> <span class="token operator">=</span> <span class="token variable">$di</span><span class="token operator">-></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'cadre:cliadr/adr'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$factory</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CliFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$context</span> <span class="token operator">=</span> <span class="token variable">$factory</span><span class="token operator">-></span><span class="token function">newContext</span><span class="token punctuation">(</span><span class="token variable">$GLOBALS</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$stdio</span> <span class="token operator">=</span> <span class="token variable">$factory</span><span class="token operator">-></span><span class="token function">newStdio</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$adr</span><span class="token operator">-></span><span class="token function">route</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'test'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">exit</span><span class="token punctuation">(</span><span class="token variable">$adr</span><span class="token operator">-></span><span class="token function">run</span><span class="token punctuation">(</span><span class="token variable">$context</span><span class="token punctuation">,</span> <span class="token variable">$stdio</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Expect revisions and documentation to come. In the meantime, please post any comments here or as an issue on GitHub.