1

我正在使用Symfonys 控制台组件,并且正在创建一个命令来显示目录中已执行的文件。为此,我想使用他们的Table helper在 Table 中显示数据。

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

    // 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 个)都应该显示在表格中,并显示正确的数据,但它只显示最后一个,所以每次setRows()显然都被循环的最后一个循环覆盖$iterator

我尝试创建一个$files数组并在循环$file结束时将每个数组推入其中$iterator,然后移出$table->setRows()循环,$iterator但当然在它内部执行 a foreach ($files as $file)withsetRows()会使您回到上一个循环覆盖前一个循环的相同情况。

据我从他们的文档中可以看出,没有一种setRow()方法可以设置可以用于每个$iterator循环的单个行,并且您也不能在该方法中放置一个foreach循环。setRows

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

4

1 回答 1

1

构建数组,然后将其传递给 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();
于 2018-01-11T11:58:58.813 回答