如何使用 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
循环的单独行,而且你不能将 foreach
在 setRows
方法中循环。
必须有一种动态设置行的方法,但我没有看到它,希望有人能帮助我。
构建数组然后将其传递给 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();
我正在使用 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
循环的单独行,而且你不能将 foreach
在 setRows
方法中循环。
必须有一种动态设置行的方法,但我没有看到它,希望有人能帮助我。
构建数组然后将其传递给 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();