A command line code generator for Drupal

Overview

Drupal Code Generator

Tests Total Downloads Minimum PHP Version

A command line code generator for Drupal.

Installation

composer require chi-teck/drupal-code-generator --dev

Optionally, generate shell completions for DCG executable.

./vendor/bin/dcg generate-completion > ~/.bash_completion

Usage

# Display navigation.
./vendor/bin/dcg

# Call generator directly.
./vendor/bin/dcg plugin:field:widget

# Generate code non-interactively.
./vendor/bin/dcg config-form -a Example -a example -a SettingsForm -a No

Compatibility

DCG PHP Symfony Twig Drupal Drush
1 7.1 - 7.4 3, 4 1, 2 7, 8 9, 10
2 7.4+ 4, 5 2, 3 7, 9 11+
3 8.1+ 6 3 10

License

GNU General Public License, version 2 or later.

Comments
  • Version check causes Twig Environment class to be loaded early

    Version check causes Twig Environment class to be loaded early

    The test for the Twig version in bootstrap.php is loading the Environment class early, even when just parsing for code analysis. I'm just starting to look at this, and I think I'm right the test doesn't happen early in the v2 (master) branch, only v1 used by Drush? So am wondering if there is already a good alternative?

    I stumbled onto the issue because of phpactor/phpactor#1043

    opened by ekes 18
  • Entity administer permissions

    Entity administer permissions

    Currently, content entity generates this kind of permissions:

    Example:

    …
    {% if bundle %}
     *   admin_permission = "administer {{ entity_type_label|lower }} types",
    {% elseif fieldable %}
     *   admin_permission = "administer {{ entity_type_label|lower }}",
    {% else %}
    …
    

    Is that safe and works as intended or this is a bug?

    If user tries to generate custom entity and gives it label "Node" it will share permissions with core "node" module. This is not very obvious and can lead to a lot of problems in the future.

    Config entity type on the other hand, uses entity_type_id.

    I propose to change content entity type permission from using this {{ entity_type_label|lower }} to that {{ entity_type_label }}. This will make generation across entity types consistent and safer for common entity labels.

    opened by Niklan 9
  • how to use default values via --answers options

    how to use default values via --answers options

    When providing answers via the --answers option, is it possible to allow the default values to be used non-interactively?

    For example, dcg twig-extension -a '{"name": "Example", "machine_name": "example", "class": "ExampleTwigExtension"}' Leaving off class prompts for input. Other values like true, false and null don't seem to work either.

    Thanks!

    opened by richardbporter 8
  • Allow symfony/filesystem v6

    Allow symfony/filesystem v6

    I was able to install this package with symfony/filesystem v6, but I also had to allow the dev-master version of friendsoftwig/twigcs as there is not yet a compatible release of that package.

    opened by mfb 7
  • The class_alias in bootstrap.php causes warnings when using preloading

    The class_alias in bootstrap.php causes warnings when using preloading

    I am using a generated preloading script which looks something like this:

    $loader = require_once '/app/web/autoload.php';
    // more lines to load PSR-4 directories (irrelevant to this issue)
    
    $files = [
        '/app/vendor/autoload.php',
        '/app/load.environment.php',
        '/app/vendor/composer/autoload_static.php',
        // more files to be preloaded
    ];
    
    foreach ($files as $file) {
        try {
            if (!(is_file($file) && is_readable($file))) {
                throw new \Exception("{$file} does not exist or is unreadable.");
            }
            require_once $file;
        } catch (\Throwable $e) {
            // ...
            throw $e;
        }
    }
    

    This script is set to opcache.preload setting. The script works and I see that the preload is making a difference, but there is a warning on all pages.

    
    Warning: Cannot declare class DrupalCodeGenerator\Twig\TwigEnvironment, because the name is already in use in /app/vendor/chi-teck/drupal-code-generator/src/bootstrap.php on line 44
    
    Warning: Cannot declare class DrupalCodeGenerator\TwigEnvironment, because the name is already in use in /app/vendor/chi-teck/drupal-code-generator/src/bootstrap.php on line 47
    

    After debugging, I realized this is because bootstrap.php is loaded by composer (it's part of composer.json's autoload.files option). As the warnings suggest, this is due to the class_alias line.

    After a lot of debugging and research, I conclude that the problem is that the preloading works somewhat differently for class_alias. In other words, this could be a PHP bug and I do some hints for this in https://github.com/php/php-src/pull/3538 and https://github.com/symfony/symfony/issues/29105.

    My theory is that while preloading correctly handles all the regular classes and functions, it cannot handle class_alias properly. Since class_alias runs both while preloading (as we are requiring the autoloader) and during the execution, it seems that the internal PHP entry for the class name persists during the runtime causing the warning.

    The fix in my case was to wrap the class_alias call inside an if block with class_exists condition. I don't see any warnings after that. I'm going to create a PR against 1.x branch for that shortly.

    Footnote: This is tangentially related to #46 but I don't know if this change would help static analyzers.

    opened by hussainweb 7
  • Cancel url used during submit() of a confirm form

    Cancel url used during submit() of a confirm form

    A bit confusing to use cancel url here IMO. https://github.com/Chi-teck/drupal-code-generator/blob/e3ce7b84f46f767ebb6405e5bfa8af3237f6ef89/templates/form/confirm/form.twig#L41

    opened by weitzman 7
  • [3.x] Decide on coding standard for generated code

    [3.x] Decide on coding standard for generated code

    Drupal 10 will require PHP 8.1 which means we can make use of all new PHP features available at this moment. However, Drupal coding standards weren't updated yet to reflect this change and will unlikely be updated in the foreseeable future. Furthermore, they don't cover PHP 7 features yet. So far, all code generated by DCG follows Drupal core coding standards. Which means if something is not covered in Drupal coding standards it uses Drupal core code base as a referencing point. Nowadays, the generated code looks very outdated as most of Drupal core code is written using PHP 5 syntax only.

    For custom projects it's not a problem to establish own standards for features that are missing in the Drupal coding standards. Example: https://github.com/Chi-teck/drupal-coder-extension

    However, for generated code that is going to be part of other projects it needs sort of community approval.

    Here is an example of the currently generated code. https://github.com/Chi-teck/drupal-code-generator/blob/3.0.0-alpha2/tests/functional/Generator/_controller/src/Controller/FooController.php

    The following example represents proposed updates.

    <?php declare(strict_types = 1);
    
    namespace Drupal\example\Controller;
    
    use Drupal\Core\Controller\ControllerBase;
    use Drupal\Core\Entity\EntityTypeManagerInterface;
    use Symfony\Component\DependencyInjection\ContainerInterface;
    
    /**
     * Returns responses for Example routes.
     */
    final class ExampleController extends ControllerBase {
    
      /**
       * The controller constructor.
       */
      public function __construct(
        private readonly EntityTypeManagerInterface $entity_type_manager,
      ) {}
    
      /**
       * {@inheritdoc}
       */
      public static function create(ContainerInterface $container): self {
        return new self($container->get('entity_type.manager'));
      }
    
      /**
       * Builds the response.
       */
      public function build(): array {
        $build['content'] = [
          '#type' => 'item',
          '#markup' => $this->t('It works!'),
        ];
        return $build;
      }
    
    }
    

    Here is an overview of the changes:

    1. Declare strict types. #3250827
    2. Use final/private/self keywords to define non-abstract classes. #3019332
    3. Use constructor property promotion. #3278431
    4. Use type hints wherever it is possible. #3154762
    5. Omit @var, @param, @return tags for strictly typed values. #3238192
    6. Mark class properties as readonly if they are not ever updated.
    7. Use trailing commas for multiline arrays, methods and annotations.
    opened by Chi-teck 6
  • [1.x]  Running commands from other commands, `HelperSet` is initialised at Application level, so InputHandler is filled with questions from prior commands.

    [1.x] Running commands from other commands, `HelperSet` is initialised at Application level, so InputHandler is filled with questions from prior commands.

    This affects running multiple commands from one

    Running commands from other commands, HelperSet is initialised at Application level, so InputHandler is filled with questions from prior commands.

    I have a generator that:

    • reads in csv data
    • calls another command to generate entity types with that data (repeatedly)

    The input from the last command is still present because the InputHandler is not re-initialised each command only at application level.

    Potential solutions:

    • Initialise a command initiated HelperSet instead of at Application
    • Re-initialise InputHandler within the command so it is clean when the command is run.

    Happy to implement a solution, would either of the above solutions be preferred or accepted?

    opened by richardgaunt 6
  • Why don't I get a menu link for my settings page when I generate a module?

    Why don't I get a menu link for my settings page when I generate a module?

    I was thinking about adding a template to generate the links menu, but I found that links.menu.twig already exists. Still, the file is not generated. Is this a known issue?

    Did not dig into the code.

    $ drush generate module
    
     Welcome to module-standard generator!
    –––––––––––––––––––––––––––––––––––––––
    
     Module name:
     ➤ Guest Upload
    
     Module machine name [guest_upload]:
     ➤ 
    
     Module description [The description.]:
     ➤ Allow anonymous users to upload images
    
     Package [Custom]:
     ➤ Other
    
     Dependencies (comma separated):
     ➤ block_upload
    
     Would you like to create install file? [Yes]:
     ➤ 
    
     Would you like to create libraries.yml file? [Yes]:
     ➤ no
    
     Would you like to create permissions.yml file? [Yes]:
     ➤ 
    
     Would you like to create event subscriber? [Yes]:
     ➤ 
    
     Would you like to create block plugin? [Yes]:
     ➤ no
    
     Would you like to create a controller? [Yes]:
     ➤ 
    
     Would you like to create settings form? [Yes]:
     ➤ 
    
     The following directories and files have been created or updated:
    –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
     • modules/custom/guest_upload/guest_upload.info.yml
     • modules/custom/guest_upload/guest_upload.install
     • modules/custom/guest_upload/guest_upload.module
     • modules/custom/guest_upload/guest_upload.permissions.yml
     • modules/custom/guest_upload/guest_upload.routing.yml
     • modules/custom/guest_upload/guest_upload.services.yml
     • modules/custom/guest_upload/src/Controller/GuestUploadController.php
     • modules/custom/guest_upload/src/EventSubscriber/GuestUploadSubscriber.php
     • modules/custom/guest_upload/src/Form/SettingsForm.php
    
    opened by greg-1-anderson 6
  • Create .phpstorm.meta.php

    Create .phpstorm.meta.php

    Please create generator phpstorm meta file. https://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata

    ###EXAMPLE

    <?php
    
    namespace PHPSTORM_META {
    
      use Drupal\node\NodeStorageInterface;
    
      override(\Drupal::service(0), map([
        'date.formatter' => \Drupal\Core\Datetime\DateFormatterInterface::class,
      ]));
      override(\Drupal::entityTypeManager()->getStorage(0), map([
        'node' => NodeStorageInterface::class,
      ]));
    }
    
    opened by batkor 6
  • ::save() method in content entity form can call parent method

    ::save() method in content entity form can call parent method

    The generated edit form for a content entity currently copies the logic from the parent method. It is a better practice to instead call the parent method.

    opened by pfrenssen 5
  • Add Revision UI while generating a content entity

    Add Revision UI while generating a content entity

    As per the Issue #2350939 on Drupal.org we can have Revision UI for Revisionable Entities.

    Update Content Entity Generator class to include Revision UI annotations in Entity Class .

    The CR has additional details for the syntaxes

    Edit:

    We might need to consider the changes that might be introduced in the issue #2976861 as well. Thanks.

    opened by bhanu951 4
  • Missing info.yml while generating a content entity

    Missing info.yml while generating a content entity

    While generating a content entity and creating a new module in the process there won't be a generated *.info.yml It seems to me this is because the command is extending the src/Command/ModuleGenerator.php Class, and the yml is created by the src/Command/Module.php class.

    opened by PetersRicardo 4
  • Add service type for config.factory.override implementations

    Add service type for config.factory.override implementations

    If I'm not mistaken we don't have this one yet: https://drupal.org/docs/drupal-apis/configuration-api/configuration-override-system#s-providing-overrides-from-modules.

    Just logging my need for it. I do not have time to make a pull request right now.

    opened by ghost 0
  • Rethink the namespace for Entity Bundle Classes

    Rethink the namespace for Entity Bundle Classes

    For now, entity bundle classes generated by DCG 2 are placed in the namespace Drupal\mymodule\Entity\Bundle:

    <?php
    
    namespace Drupal\mymodule\Entity\Bundle;
    
    use Drupal\node\Entity\Node;
    
    /**
     * A bundle class for node entities.
     */
    class ArticleBundle extends Node {
    ...
    }
    
    

    However, most documentation and blog posts I've seen for now favor putting them directly in the 'Entity' namespace. Here's an excellent example: https://www.hashbangcode.com/article/drupal-9-entity-bundle-classes.

    This is highly opinionated, but IMHO DCG should follow established best practices, so I'd suggest changing the namespace.

    opened by drubb 8
  • Do not override constructors for service objects, plugins, and controllers

    Do not override constructors for service objects, plugins, and controllers

    Problem/Motivation

    According to the Drupal 8 Backward Compatibility Policy, constructors for service objects are considered internal, which means they are subject to change on a minor release:

    The constructor for a service object (one in the container), plugin, or controller is considered internal unless otherwise marked, and may change in a minor release. These are objects where developers are not expected to call the constructor directly in the first place. Constructors for value objects where a developer will be calling the constructor directly are excluded from this statement.

    The implication is that if we override their constructors, and they happen to change their signature on a minor release, it would require us to update our current code for all instances where we're overriding their constructors, to conform to the new signature. This shouldn't have to happen to conform to a minor release.

    There is a good blog post from jrockwitz (maintainer of Webform for D8), that goes into more detail: https://www.jrockowitz.com/blog/webform-road-to-drupal-9

    Solution

    We can implement a new design pattern that would fix the problem.

    As an example, from the controller command, injecting 3 services as an example.

    Before:

    ...
      public function __construct(
        RequestStack $request_stack,
        LoggerInterface $logger,
        Client $httpClient) {
        $this->request = $request_stack->getCurrentRequest();
        $this->logger = $logger;
        $this->httpClient = $httpClient;
      }
    
      public static function create(ContainerInterface $container) {
        return new static(
          $container->get('request_stack'),
          $container->get('logger.factory')->get('foo'),
          $container->get('http_client')
        );
      }
    ...
    

    After:

    ...
      public static function create(ContainerInterface $container) {
        $instance = parent::create($container);
        $instance->request = $container->get('request_stack')->getCurrentRequest();
        $instance->logger = $container->get('logger.factory')->get('foo');
        $instance->httpClient = $container->get('http_client');
        return $instance;
      }
    ...
    

    Some of the most used Drupal contrib modules are already using this design pattern, like the aforementioned Webform, Migrate Plus, Search API, etc.

    Some extra benefits from this approach also include less code bloat:

    • We no longer need a __construct() method, since the __construct() and create() methods are effectively merged into one.
    • We no longer need a use statement per service injected. Their only purpose was so we could typehint on the constructor.

    That reduces the final code lines by quite a bit. Also due to the above, adding a new service dependency injection after already running the generate command is no longer a major PITA.

    I think this solution would include:

    • A change in di.twig's container(services) macro that would use this new design pattern.
    • A change to the generator twig template files, to use this new function, and also remove the now unnecessary use statements as well as the constructor.

    I have a PR ready for these changes.

    This solution could be applied to the following generators:

    • [x] controller
    • [x] block
    • [x] views-argument-default
    • [x] views-field
    opened by GueGuerreiro 9
Releases(2.6.0)
  • 2.6.0(Sep 15, 2022)

  • 2.5.2(Mar 30, 2022)

  • 2.5.1(Feb 24, 2022)

  • 2.5.0(Feb 22, 2022)

  • 2.4.1(Jan 18, 2022)

  • 2.4.0(Jan 18, 2022)

    • Require Drupal 9 or Drupal 10 in module info file #73
    • Drop support for global installation #76
    • Shorten bundle class alias #78
    • Add 'All' choice for bundle selection in bundle class generator #79
    Source code(tar.gz)
    Source code(zip)
  • 2.3.2(Jan 12, 2022)

  • 2.3.1(Dec 9, 2021)

  • 2.3.0(Nov 24, 2021)

  • 2.2.0(Oct 15, 2021)

  • 2.1.1(Oct 10, 2021)

  • 2.1.0(Oct 10, 2021)

  • 1.33.1(Dec 5, 2020)

  • 2.0.0(Oct 21, 2020)

    Release notes

    New API for generators

    DCG 2 generators are not API compatible with DCG 1 however porting them to DCG 2 should be trivial.

    Generators must extend one of the following abstract classes.

    Generator
      └── DrupalGenerator
            ├── Theme generator
            └── ModuleGenerator
                  └── PluginGenerator
    

    Example:

    /**
     * Implements controller command.
     */
    final class Controller extends ModuleGenerator {
    
      protected $name = 'controller';
      protected $description = 'Generates a controller';
      protected $templatePath = __DIR__;
    
      /**
       * {@inheritdoc}
       */
      protected function generate(array &$vars): void {
        $this->collectDefault($vars);
    
        $vars['class'] = $this->ask('Class', '{machine_name|camelize}Controller');
    
        $this->collectServices($vars, FALSE);
    
        if ($this->confirm('Would you like to create a route for this controller?')) {
          $vars['route_name'] = $this->ask('Route name', '{machine_name}.example');
          $vars['route_path'] = $this->ask('Route path', '/{machine_name|u2h}/example');
          $vars['route_title'] = $this->ask('Route title', 'Example');
          $vars['route_permission'] = $this->ask('Route permission', 'access content');
          $this->addFile('{machine_name}.routing.yml', 'route.twig')->appendIfExists();
        }
    
        $this->addFile('src/Controller/{class}.php', 'controller.twig');
      }
    
    }
    

    Updated requirements

    DCG 2 requires PHP 7.3+, symfony/console 4+, twig/twig 2+ and therefore cannot be installed locally with Drupal 8. Also, the generated code is supposed to work on Drupal 9 without triggering any deprecation notices. This means it may not be compatible with Drupal 8. For this reason it is better to keep using DCG 1 for Drupal 8 development.

    Generator namespaces have been changed

    In DCG 1 generators were organized by Drupal core version. For example d7:hook, d8:hook, etc. With Drupal 9 release it does not make much sense as the Drupal 9 API is mainly compatible with Drupal 8. So that all Drupal 8 generators have been extracted into root namespace, i.e. d8:hook => hook. Drupal 7 generators can be found under misc:d7 namespace.

    Answer option now accepts multiple values

    The --answer option no longer accepts JSON encoded strings. Multiple answers can be passed as follows.

    dcg controller -a Foo -a foo -a FooController -a No -a No
    

    Improved entity type generators

    DCG 2 is capable to generate entity types for existing modules.

    Added support for inline templates.

    $this->addFile('hello.txt')->inlineTemplate('Hello {{ name }}!');
    

    Added support for symlinks.

    $this->addSymlink('link.txt', 'source-file.txt');
    

    New base class for generator tests

    GeneratorTester helper has been replaced with BaseGeneratorTest class. Usage example.

    New generate completion command

    The command generates a completion script for DCG application. dcg generate-completion --shell=bash >> ~/.bash_completion

    Dry run mode

    When running a generator with --dry-run option the generated code will not be dumped to file system but printed to terminal. To get information about rendered templates and collected variables enable debug verbosity (-vvv).

    PSR-3 logger

    Generators and helpers may print messages to terminal using PSR-3 console logger.

    $this->logger->debug('Example message.');
    

    Extended result printer

    Enable verbose mode (-v) to print the information about generated assets in tabular form.

     ------ ---------------------------------- ------- -------- 
      Type   Path                               Lines     Size  
     ------ ---------------------------------- ------- -------- 
      file   example.links.action.yml               6      125  
      file   example.links.menu.yml                11      320  
      file   example.links.task.yml                23      630  
      file   example.module                        84     2199  
      file   example.permissions.yml                4       83  
      file   example.routing.yml                    8      201  
      file   src/ExampleInterface.php              15      342  
      file   src/ExampleListBuilder.php            96     2798  
      file   templates/example.html.twig           21      493  
      file   src/Entity/Example.php               175     5173  
      file   src/Form/ExampleForm.php              43     1216  
      file   src/Form/ExampleSettingsForm.php      49      919  
     ------ ---------------------------------- ------- -------- 
             Total: 12 assets                     535   14 KiB  
     ------ ---------------------------------- ------- -------- 
    

    Drupal context

    When installed as local Composer package DCG is capable to bootstrap Drupal. This enables some advanced features that can improve user experience. For example, autocompletion for Drupal modules and services.

    Destination option

    The new --destination option allows to override destination directory for dumped assets.

    Source code(tar.gz)
    Source code(zip)
    dcg.phar(1.81 MB)
  • 2.0.0-RC3(Oct 14, 2020)

  • 1.33.0(Oct 11, 2020)

  • 2.0.0-RC2(Jul 25, 2020)

    • Added $vars parameter to ::generate method
    • Fixed minor bugs in field generator
    • Changed choice question prompt
    • Added base class for testing generators
    • Added Drupal package types to composer.json generator (#49)
    • Removed references to Drupal 8 (#50)
    • Added PHAR compile script
    Source code(tar.gz)
    Source code(zip)
    dcg.phar(1.80 MB)
  • 1.32.1(Jul 15, 2020)

  • 2.0.0-RC1(Jun 29, 2020)

  • 1.32.0(Apr 16, 2020)

    • Dropped support for PHP 5.6 and PHP 7.0
    • Added support for PHP 7.4
    • Project generator now use core Composer plugins
    • Added phpstorm-metadata generator (#43)
    • Dropped support for PUT method in Rest resource plugin
    • Added class question to event subscriber generator
    • Added class question to route subscriber generator
    • Added class question to middleware generator
    • Improved compatibility with Drupal 9
    Source code(tar.gz)
    Source code(zip)
    dcg.phar(1.56 MB)
  • 2.0.0-beta6(Apr 11, 2020)

    • Improved content entity generator
    • Added symlink asset type
    • Added generate-completion command
    • project generator is now using core Composer plugins
    • Dropped support for PHP 7.2
    • Added logger to helpers
    • Added destination option
    Source code(tar.gz)
    Source code(zip)
    dcg.phar(1.55 MB)
  • 2.0.0-beta5(Dec 8, 2019)

    • Refactored Assets management
    • Removed support for custom generators
    • Improved compatibility with Drupal 9
    • Added support for Symfony 5
    • Add support for Twig 3
    • Added support for PHP 7.4
    • Dropped support for PHP 7.1
    Source code(tar.gz)
    Source code(zip)
    dcg.phar(1.45 MB)
  • 1.31.0(Dec 7, 2019)

  • 1.30.5(Oct 27, 2019)

  • 1.30.4(Aug 25, 2019)

  • 1.30.3(Jun 29, 2019)

  • 1.30.2(Jun 29, 2019)

  • 1.30.1(Jun 29, 2019)

Owner
Ivan
Drupal developer
Ivan
This bundle provides new generator command line tools for doctrine generator.

GenBundle This bundle provides new generator command line tools for doctrine generator, extending SensioGeneratorBundle. php bin/console gen:generate:

Koldo Picaza 5 Sep 6, 2016
A powerful command line application framework for PHP. It's an extensible, flexible component, You can build your command-based application in seconds!

CLIFramework CLIFramework is a command-line application framework, for building flexiable, simple command-line applications. Commands and Subcommands

Yo-An Lin 428 Dec 13, 2022
Lovely PHP wrapper for using the command-line

ShellWrap What is it? It's a beautiful way to use powerful Linux/Unix tools in PHP. Easily and logically pipe commands together, capture errors as PHP

James Hall 745 Dec 30, 2022
A PHP library for command-line argument processing

GetOpt.PHP GetOpt.PHP is a library for command-line argument processing. It supports PHP version 5.4 and above. Releases For an overview of the releas

null 324 Dec 8, 2022
Command-Line Interface tools

Aura.Cli Provides the equivalent of request ( Context ) and response ( Stdio ) objects for the command line interface, including Getopt support, and a

Aura for PHP 102 Dec 31, 2022
Another Command Line Argument Parser

Optparse — Another Command Line Argument Parser Install 1. Get composer. 2. Put this into your local composer.json: { "require": { "chh/optparse

Christoph Hochstrasser 18 Nov 1, 2019
👨🏻‍🚀 A command-line tool that gives you the Alpine Day 2021 schedule in your timezone. 🚀

Alpine Day Schedule a command-line tool that gives you the Alpine Day 2021 schedule in your timezone. ?? Quick start Requires PHP 7.4+ # First, instal

Nuno Maduro 11 Jun 10, 2021
PHP Interminal is a command-line tool that gives you access to PHP Internals discussions in your terminal.

PHP Interminal is a command-line tool that gives you access to PHP Internals discussions in your terminal. ??

Nuno Maduro 32 Dec 26, 2022
Patrol is an elegant command-line tool that keeps your PHP Project's dependencies in check.

Patrol is an elegant command-line tool that keeps your PHP Project's dependencies in check. Installation / Usage Requires PHP 8.0+ First, install Patr

Nuno Maduro 237 Nov 14, 2022
Twitter raffles in the command line, with PHP and minicli

Rafflebird Rafflebird is a highly experimental CLI application for giveaways / raffles on Twitter, built in PHP with Minicli. Disclaimer: The recent s

Erika Heidi 33 Nov 16, 2022
A PHP command line tool used to install shlink

Shlink installer A PHP command line tool used to install shlink. Installation Install this tool using composer.

null 8 Nov 3, 2022
Laracon Schedule a command-line tool that gives you the Laracon Online schedule in your timezone.

Laracon Schedule a command-line tool that gives you the Laracon Online schedule in your timezone. ?? Quick start Requires PHP 7.4+ # First, install: c

Nuno Maduro 101 Sep 16, 2022
Command-line control panel for Nginx Server to manage WordPress sites running on Nginx, PHP, MySQL, and Let's Encrypt

EasyEngine v4 EasyEngine makes it greatly easy to manage nginx, a fast web-server software that consumes little memory when handling increasing volume

EasyEngine 2k Jan 4, 2023
Generic PHP command line flags parse library

PHP Flag Generic PHP command line flags parse library Features Generic CLI options and arguments parser. Support set value data type(int,string,bool,a

PHP Toolkit 23 Nov 13, 2022
A simple command-line tool whose aim is to facilitate the continous delivery of PHP apps

Deployer Simple command-line tool that aims to facilitate the continous delivery of PHP apps, particularly Laravel apps. Imagine you want to update yo

Fernando Bevilacqua 4 Sep 8, 2021
🍃 In short, it's like Tailwind CSS, but for the PHP command-line applications.

Termwind Termwind allows you to build unique and beautiful PHP command-line applications, using the Tailwind CSS API. In short, it's like Tailwind CSS

Nuno Maduro 1.8k Dec 30, 2022
A PHP Command Line tool that makes it easy to compile, concat, and minify front-end Javascript and CSS/SCSS dependencies.

Front End Compiler A PHP Command Line tool that makes it easy to compile, concat, and minify front-end Javascript and CSS/SCSS dependencies. The minif

Happy Medium 2 Nov 12, 2021
php command line script to DCA crypto from Coinbase Pro

dca.php A simple php script designed to be run via the command line via a cron job. This will connect to coinbase pro and buy the crypto coins specifi

Ben Suffolk 2 Oct 22, 2021
Simple command-line tool to access HiWeb account information

Simple command-line tool to access HiWeb account information.

Milad Nekofar 2 Dec 26, 2022