Lets build a utopian cli clone
What Will I Learn?
In this tutorial, you will learn to build a useful real world php command line app. It is the 2nd in a series of Building command line apps in php
Requirements
To follow along, you must have gone through my first tutorial in this series (https://utopian.io/utopian-io/@therealsmat/building-command-line-applications-in-php). It contains details on how to get up and running with building command line apps in php.
Difficulty
Intermediate
Tutorial Contents
We are going to build a clone of @amosbastian's Command Line Tool in php.
Step 1
Create a new folder for this project and navigate into the folder. On your terminal (or command line for windows), type
$ sudo mkdir utopian-cli && cd utopian-cli
Step 2
Create a composer.json file and add the following lines
{
"require": {
"symfony/console": "~2.0"
}
}
On your terminal, run composer install
. This will pull in the console package for our use.
Step 3
Create a file named utopian. Note that this file has no extention. Open the file and add this code at the top.
#! /usr/bin/env php
.
Also require composer autoload like this require 'vendor/autoload.php';
. You should have this now;
#! /usr/bin/env php
<?php
require 'vendor/autoload.php';
Step 4
Now lets setup out tool.
<?php
use Symfony\Component\Console\Application;
require 'vendor/autoload.php';
$app = new Application("PHP Console tool for utopian.io", "1.0");
$app->run();
Step 5
Our first command: Moderators
- Create a directory called
src
. Insrc
, create a file namedModeratorsCommand.php
. This will contain the logic for our Moderators command. - In the
ModeratorsCommand.php
file, paste the following code.
<?php
namespace therealsmat;
use Symfony\Component\Console\Command\Command;
class ModeratorsCommand extends command {
public function configure(){
}
public function execute(){
}
}
Add the following to your composer.json
file.
,
"autoload": {
"psr-4": {
"therealsmat\\": "src"
}
}
This will enable us map therealsmat namespace to our src directory. Of course you are free to change therealsmat
to anything you want.
Next run composer dump-autoload
from your terminal.
Step 6
Lets think for a moment. What do we want to do exactly? We need to make http calls to utopian api. Of course, there are several ways to do this. We'll be using the popular guzzle-http client
for that.
In your composer.json
file, add the require "guzzlehttp/guzzle": "~6.0"
.
Go to your command line and run composer update
to pull in the client.
Add a protected property protected $baseUrl = 'https://api.utopian.io/api';
to the command class.
Now lets create a helper method in our command class to make http calls easier. We'll use the popular http verbs as the method names. So for a GET
request,
protected function get($url)
{
$uri = $this->baseUrl.$url;
$response = (new Client)->get($uri)->getBody();
return (string) $response;
}
Now lets get the number of moderators we have on utopian.
private function countModerators(OutputInterface $output){
$moderators = json_decode($this->get('/moderators'), true);
$output->writeln($moderators['total']);
}
You entire class should look like this now;
<?php
namespace therealsmat;
use GuzzleHttp\Client;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class ModeratorsCommand extends command{
protected $baseUrl = 'https://api.utopian.io/api';
public function configure()
{
$this->setName('moderators')
->setDescription("List Moderators and their activities")
->addOption('count',null,InputOption::VALUE_OPTIONAL, 'Count the number of moderators on utopian', 1);
}
public function execute(InputInterface $input, OutputInterface $output)
{
if ($input->getOption('count')) {
return $this->getModerators($output);
}
}
private function countModerators(OutputInterface $output){
$moderators = json_decode($this->get('/moderators'), true);
$output->writeln($moderators['total']);
}
private function get($url)
{
$uri = $this->baseUrl.$url;
$response = (new Client)->get($uri)->getBody();
return (string) $response;
}
Finally, we have to register this new command in our executable. Our utopian file should now look like this;
#! /usr/bin/env php
<?php
use therealsmat\ModeratorsCommand;
use Symfony\Component\Console\Application;
require 'vendor/autoload.php';
$app = new Application("PHP Console tool for utopian.io", "1.0");
$app->add(new ModeratorsCommand);
$app->run();
Go to your command line, then run ./utopian moderators --count
,
You should be up and running with building command line apps.
Curriculum
Posted on Utopian.io - Rewarding Open Source Contributors
this is the good tutorial
Thank you for the contribution. It has been approved.
You can contact us on Discord.
[utopian-moderator]
Hey @therealsmat I am @utopian-io. I have just upvoted you!
Achievements
Suggestions
Get Noticed!
Community-Driven Witness!
I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!
Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x
This is an exceptional tutorial