Github Link: https://github.com/kzorluoglu/chameleon-installer
Asciiname URL: https://asciinema.org/a/rJL6Se0R943agLPneUSNmO3h4
asciinema Animation:

Usage
You can install the Chameleon Shop Installer globally using Composer:
composer global require kzorluoglu/chameleon-installer

Creating a New Project
Once installed, you can create a new Chameleon project using:
chameleon create /path/to/your/new/shop
Replace /path/to/your/new/shop with the desired directory for your new Chameleon Shop.
The Inspiration:
My journey began with Laravel’s CLI. Working with Laravel’s streamlined command-line interface always seemed to boost my productivity. On the flip side, my day job involves Symfony, which offers the powerful Symfony CLI. This overlap of technologies sparked an idea – why not create a globally runnable PHP installer binary using Composer? This project wasn’t just about building a tool; it was about deepening my understanding of PHP’s capabilities.
The starting point was an existing web-based installer I had developed earlier. This web installer, with its efficient workflow, became my blueprint. I decided to use Symfony Console and YAML features, aiming to leverage Symfony’s robustness and flexibility.
Transitioning from a web installer to a CLI tool was challenging yet exhilarating. I dove into the Symfony Console documentation, finding SymfonyStyle particularly useful for beautifying the console output. Every line of code was a learning opportunity, helping me understand the intricacies of CLI development in PHP.
One fascinating aspect of the Laravel Installer is its entry point, the bin/laravel file. This script begins with #!/usr/bin/env php, a shebang line that makes the file executable directly from the command line. It then conditionally loads Composer’s autoloader, crucial for accessing the Laravel framework and its dependencies.
Here’s a simplified snippet of Laravel’s approach:
#!/usr/bin/env php
<?php
// Autoload files based on the project's context
if (file_exists(__DIR__ . '/../../../autoload.php')) {
require __DIR__ . '/../../../autoload.php';
} else {
require __DIR__ . '/../vendor/autoload.php';
}
// ... Laravel Installer logic ...
This project was more than just a tool; it was a bridge between Laravel’s elegance and Symfony’s power. It not only enhanced my technical skills but also deepened my appreciation for PHP’s versatility.
Expanding on the Laravel inspiration, I integrated Symfony’s styling capabilities to enhance the user interface of my tool. Symfony Console’s SymfonyStyle class offers an elegant way to format console output, making interactions more user-friendly.
Here’s an example of how I used SymfonyStyle in the execute method:
protected function execute(InputInterface $input, OutputInterface $output): int {
$io = new SymfonyStyle($input, $output);
$io->title('Chameleon Creating Tool');
$io->section('Requirement Checks started');
// Requirement check logic...
$io->error("Error executing query: ".$e->getMessage());
}
Views: 8