CakePHP 3 has an excellent support for command line Shells, Tasks, and Console Tools. There are a few that are bundled with the framework itself, and that come from a variety of plugins. And, of course, you can have your own commands, specific to your application.
$ ./bin/cake
Welcome to CakePHP v3.4.3 Console
---------------------------------------------------------------
App : src
Path: /home/leonid/Work/cakephp_test/src/
PHP : 7.0.16
---------------------------------------------------------------
Current Paths:
* app: src
* root: /home/leonid/Work/cakephp_test
* core: /home/leonid/Work/cakephp_test/vendor/cakephp/cakephp
Available Shells:
[Bake] bake
[DebugKit] benchmark, whitespace
[Migrations] migrations
[CORE] cache, i18n, orm_cache, plugin, routes, server
[app] console
To run an app or core command, type `cake shell_name [args]`
To run a plugin command, type `cake Plugin.shell_name [args]`
To get help on a specific command, type `cake shell_name --help`
There is one tiny little annoyance though. Sometimes, it’s useful to get an output of the CakePHP Shell and use it in another script. For example, you might need to get a list of all loaded plugins and loop over them, performing another action, outside of CakePHP. Say, in a bash script. Getting a list of loaded plugins is easy with the bundled shell like so:
$ ./bin/cake plugin loaded
Welcome to CakePHP v3.4.3 Console
---------------------------------------------------------------
App : src
Path: /home/leonid/Work/cakephp_test/src/
PHP : 7.0.16
---------------------------------------------------------------
Bake
DebugKit
Migrations
But, as you can see, the output is not very useful for machine processing. The welcome header is in the way. Sure, you can parse it out with regular expressions, or even a simple line count. But that lacks elegance. Is there a better way? I thought there was.
My first approach was to use the –quiet option, which, I thought, would leave me with just the needed output. It turns out, that’s not what it does. It strips out all the output, and there is no list of plugins at all.
The second approach worked out better. I learned about it from this thread. The solution is to extend the needed CakePHP shell and overwrite the protected _welcome() method. Here’s the content of the newly created application level shell in src/Shell/PluginShell.php:
<?php
namespace App\Shell;
use Cake\Shell\PluginShell as Shell;
class PluginShell extends Shell
{
/**
* Silence the welcome message
*
* @return void
*/
protected function _welcome()
{
}
}
And now running the same command as before produces a cleaner output:
$ ./bin/cake plugin loaded
Bake
DebugKit
Migrations
This now can be easily used in other scripts without any need for regular expressions and other trimming techniques.