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.

