Closed6

cakephpのJSON文字列を引数に取るcommandでテスト書いたらクォートがパースされてJSONにならない

kyoune01kyoune01

commandの引数にJSON文字列(e.g. cake hoge "{"json":"test"}")を渡したいんだけれど、TestCase時はコマンドをパースするので「”」が除去されて想定どおり動作しない……

// 打ちたいコマンド
cake hoge "{\"json\":\"test\"}"
// TestCaseで実行されるコマンド:
cake hoge {json:test}
kyoune01kyoune01

ダメなやつ

class HogeCommandTest extends TestCase
{
    public function testExecute()
    {
        $this->exec("hoge \"{\"id\":\"1234\",\"name\":\"huga\"}\"");
    }
}
kyoune01kyoune01

問題の箇所

 $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;
        }
kyoune01kyoune01

シングルクォートで囲めばいける説(受:アドバイス)

kyoune01kyoune01

いったわ

class HogeCommandTest extends TestCase
{
    public function testExecute()
    {
        $this->exec('hoge "{\"id\":1234,\"name\":\"huga\"}" ');
    }
}
このスクラップは2020/12/16にクローズされました