Closed6
cakephpのJSON文字列を引数に取るcommandでテスト書いたらクォートがパースされてJSONにならない
commandの引数にJSON文字列(e.g. cake hoge "{"json":"test"}")を渡したいんだけれど、TestCase時はコマンドをパースするので「”」が除去されて想定どおり動作しない……
// 打ちたいコマンド
cake hoge "{\"json\":\"test\"}"
// TestCaseで実行されるコマンド:
cake hoge {json:test}
ダメなやつ
class HogeCommandTest extends TestCase
{
public function testExecute()
{
$this->exec("hoge \"{\"id\":\"1234\",\"name\":\"huga\"}\"");
}
}
パースしてそうな箇所
問題の箇所
$charCount = strlen($command);
$argv = [];
$arg = '';
$inDQuote = false;
$inSQuote = false;
for ($i = 0; $i < $charCount; $i++) {
// コマンドを1文字ずつ分解
$char = substr($command, $i, 1);
// 多分囲ってるクォートも含めて全部終わった一番最後
if ($char === ' ' && !$inDQuote && !$inSQuote) {
if (strlen($arg)) {
$argv[] = $arg;
}
$arg = '';
continue;
}
// 全体を囲ってるクォート種類が来れば1文字列が終了
if ($inSQuote && $char === "'") {
$inSQuote = false;
continue;
}
if ($inDQuote && $char === '"') {
$inDQuote = false;
continue;
}
// 全体が囲ってるクォートがどっちか判断
if ($char === '"' && !$inSQuote) {
$inDQuote = true;
continue;
}
if ($char === "'" && !$inDQuote) {
$inSQuote = true;
continue;
}
// 何もなければ結合していく
$arg .= $char;
}
シングルクォートで囲めばいける説(受:アドバイス)
いったわ
class HogeCommandTest extends TestCase
{
public function testExecute()
{
$this->exec('hoge "{\"id\":1234,\"name\":\"huga\"}" ');
}
}
このスクラップは2020/12/16にクローズされました