[Laravelや] SymfonyのConsoleCommandが名前を省略可能な事を初めて知った [Composerも]

[Symfony Advenet Calander 2016](http://qiita.com/advent-calendar/2016/symfony)の20日目の記事です。
最初に申し上げると、正直役に立たない内容です。ネタとしてお楽しみ下さい🙇🙏

---

この間衝撃的な事がありました。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Symfony\Console、一致するコマンドが1個だけであれば名前を省略可能なの知らなかった。例えばdoctrine:schema:validateはd:s:vでいけるｗ<br>反対にserver:stop、server:start等複数マッチするs:sはダメ</p>&mdash; I-METAL (@Issei_M) <a href="https://twitter.com/Issei_M/status/803161908878581760">November 28, 2016</a></blockquote>

Symfony (>=2)ユーザー5年目にして初めて知ったのでちょっと驚きましが、ドキュメントにバッチリ書かれてるんですね。しかも2.0からこの仕様との事😳　

> You do not have to type out the full command names. You can just type the shortest unambiguous name to run a command. So if there are non-clashing commands
>
> _意訳：コマンド名は全て入力する必要はありません。衝突しない範囲で曖昧に指定する事が可能です。_
>
> 引用：[Using Console Commands, Shortcuts and Built-in Commands#Shortcut Syntax](http://symfony.com/doc/2.0/components/console/usage.html#shortcut-syntax)

上記のドキュメントに軽く仕様が書かれていますが、ざっくり言うとコロン毎に区切って全てに前方一致する名前 (aliasも含む) のコマンドが1つだけあれば良いみたいな感じだと思います。
実際に`doctrine:schema:validate`で試してみましょう：

```
$ php bin/console d:s:v
[Mapping]  OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping file.

$ php bin/console doc:s:v
[Mapping]  OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping file.

$ php bin/console d:s:valid
[Mapping]  OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping file.
```

ご覧の通り、`d:s:v`や`doc:s:v`や`d:s:valid`のような曖昧な名前でもコマンドが実行できている事が分かります。（"[Database]" がFAILなのは気にしないでください。）

尚、条件に一致するコマンドが複数見つかった場合、完全一致するコマンドがその中に無ければエラーとなります。例えば、`s:s`はデフォルトでは`server:start`等の多数のコマンドに一致する為エラーとなりますが、`s:s`と言う名前のコマンドを新たに作ると実行が可能となります。
この為、略称はいつか衝突するかもしれないので手動でコマンドを叩く時以外は使わないのが無難です。

そうなると、ほぼ使い道が無さそうに見えますが`c:c` (`cache:clear`) は便利だなと思いました:

```
$ php bin/console c:c --no-warmup
 
 // Clearing the cache for the dev environment with debug true

 [OK] Cache for the "dev" environment (debug=true) was successfully cleared.
```

## 他のコンソールアプリケーションでも試してみる

さて、SymfonyのConsoleは様々なPHP Projectで使われてます。と言う事は、ComposerやみんなだいすきLaravelでも同様にコマンドが実行できそうです。実際に試してみましょう。

### Composer

```
$ composer ins
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
.
.
.
```

(`info`がある為) 残念ながら、`i`でインストールはできませんでした😭

```
$ composer u
Loading composer repositories with package information
Updating dependencies (including require-dev)
.
.
.
```

`u`でアップデートは行けました🙆

### Laravel

```
$ laravel n laravel-pj
Crafting application...
.
.
.
Application ready! Build something amazing.
```

laravelコマンドでは`n`だけで`new`コマンドが実行できました。また、`artisan`でも同様に略名が使用可能です:

```
$ php artisan v:c
Compiled views cleared!

$ php artisan r:cl
Route cache cleared!

$ php artisan ca:cl
Cache cleared successfully.
```

上から`view:clear`, `route:clear`, `cache:clear`になります。`r:c`や`c:c`は衝突するの残念ながら下2つは上記のようになりました。

## 感想

初めて知った時はウッキウキで色々試してみましたが、割りと略名が衝突しているケースも多く、かつこれまでよく使うコマンドはbashのaliasを貼っていたので、ビルトインなコマンドでは正直余り恩恵は感じられなかったです。（有名所がこの命名規則を意識していない？あたり、余り浸透していない機能なのかもしれません）

また、略名はcron等の自動化された環境で使ってると、いきなり動かなくなる危険性をはらんでいるのでターミナルから叩く時以外は使用しないのが無難でしょう。

ただSymfonyのConsole、PHPでは使う機会が多いと思うので是非普段使ってるコマンドで試してみて下さい😉🎵