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.