如何使用 Symfony 控制台设置动态 table 行

How to set dynamic table rows with Symfony Console

我正在使用 Symfonys Console component and I'm creating a command that displays what files in a directory have been executed. To do this I want to display the data in a Table using their Table helper

在他们的文档中,它仅使用带有硬编码输出的示例,是否可以动态添加此数据。这是我的代码:

    // Create a new Table object
        $table = new Table($output);


    // Set the table headers
        $table->setHeaders(['Executed', 'File', 'Processed']);


    // Create a new Iterator object
        $iterator = new FilesystemIterator(dirname(__DIR__) . Config::SCRIPT_PATH);


    // Cycle through iterated files
        foreach ($iterator as $item) {

            // Set the file
                $file = (object) [
                    'executed' => 'No',
                    'name' => $item->getFilename(),
                    'processed' => ''
                ];


            // Find the script in the database
                $script = Script::where('file', $file->name)->first();


            // Check Script exists
                if ($script) {

                    // Update the file properties
                        $file->executed = 'Yes';
                        $file->processed = $script->created_at

                }


            // Set the table rows
                $table->setRows([
                    [$file->executed, $file->name, $file->processed]
                ]);

        }


    // Render the table to the console
        $table->render();

对我来说,它应该找到的每个文件(目前是 3 个)都应该以正确的数据显示在 table 中,但它只显示最后一个,所以每次 setRows() 显然是被 $iterator 循环的最后一个循环覆盖。

我尝试创建一个 $files 数组并在 $iterator 循环结束时将每个 $file 推入其中,然后将 $table->setRows() 移出 [=13] =] 循环,但当然做一个 foreach ($files as $file) 里面有 setRows() 会让你回到最后一个循环覆盖前一个循环的相同情况。

据我从他们的文档中看到的,没有 setRow() 方法来设置我可以用于每个 $iterator 循环的单独行,而且你不能将 foreachsetRows 方法中循环。

必须有一种动态设置行的方法,但我没有看到它,希望有人能帮助我。

构建数组然后将其传递给 setRows,不要在循环中使用 setRows。

试试下面的代码:

<?php
// Create a new Table object
$table = new Table($output);

// Set the table headers
$table->setHeaders(['Executed', 'File', 'Processed']);

// Create a new Iterator object
$iterator = new FilesystemIterator(dirname(__DIR__) . Config::SCRIPT_PATH);

// Cycle through iterated files
$rows = [];
foreach ($iterator as $item) {

    // Set the file
    $file = (object) [
        'executed' => 'No',
        'name' => $item->getFilename(),
        'processed' => ''
    ];

    // Find the script in the database
    $script = Script::where('file', $file->name)->first();

    // Check Script exists
    if ($script) {
        // Update the file properties
        $file->executed = 'Yes';
        $file->processed = $script->created_at;
    }

    $rows[] = [$file->executed, $file->name, $file->processed];
}

// Set the table rows
$table->setRows($rows);

// Render the table to the console
$table->render();