diff --git a/docs/en/building_the_cache.md b/docs/en/building_the_cache.md
index 73c47da2..2f9136c3 100644
--- a/docs/en/building_the_cache.md
+++ b/docs/en/building_the_cache.md
@@ -4,19 +4,19 @@ There are two main ways the cache is built:
## OnAfterPublish Hook
-This calls `urlsToCache()` on a page after it is published. By default, it will cache
-only its own URL and the ones of its parents. These URLs are added to a
+This calls `urlsToCache()` on a page after it is published. By default, it will cache
+only its own URL and the ones of its parents. These URLs are added to a
`GenerateStaticCacheJob` to be executed on the next run.
-To alter which URLs are sent to be cached, you should override the `urlsToCache()`
+To alter which URLs are sent to be cached, you should override the `urlsToCache()`
method.
## Full Site Build
You can generate cache files for the entire site via the `StaticCacheFullBuildJob`.
This can either be queued up from the QueuedJobs interface or via the task
-`dev/tasks/SilverStripe-StaticPublishQueue-Task-StaticCacheFullBuildTask`. This task also takes a parameter `?startAfter`
-which can delay the execution of the job. The parameter should be in HHMM format,
+`dev/tasks/static-cache-full-build`. This task also takes a parameter `?startAfter`
+which can delay the execution of the job. The parameter should be in HHMM format,
e.g. to start after 2pm, pass `?startAfter=1400`. If it's already after the proposed
time on the current day, it will push it to the next day.
@@ -24,7 +24,7 @@ If you want to do a full site build on a cron, you should do so via the task. An
example configuration would be:
```bash
-# build the cache at 1am every day
-0 1 * * * www-data /path/to/sake dev/tasks/SilverStripe-StaticPublishQueue-Task-StaticCacheFullBuildTask
+# build the cache at 1am every day
+0 1 * * * www-data vendor/bin/sake tasks:static-cache-full-build
```
diff --git a/src/Task/StaticCacheFullBuildTask.php b/src/Task/StaticCacheFullBuildTask.php
index 9c9c58c3..6f725f07 100644
--- a/src/Task/StaticCacheFullBuildTask.php
+++ b/src/Task/StaticCacheFullBuildTask.php
@@ -3,29 +3,32 @@
namespace SilverStripe\StaticPublishQueue\Task;
use DateTime;
-use SilverStripe\Control\Director;
-use SilverStripe\Control\HTTPRequest;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Dev\BuildTask;
+use SilverStripe\HybridExecution\HybridOutput;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\StaticPublishQueue\Job\StaticCacheFullBuildJob;
use Symbiote\QueuedJobs\DataObjects\QueuedJobDescriptor;
use Symbiote\QueuedJobs\Services\QueuedJob;
use Symbiote\QueuedJobs\Services\QueuedJobService;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
class StaticCacheFullBuildTask extends BuildTask
{
- protected $title = 'Static Cache Full Build';
+ protected static string $commandName = 'static-cache-full-build';
+
+ protected string $title = 'Static Cache Full Build';
+
+ protected static string $description = 'Fully build the static cache for the whole site';
/**
* Queue up a StaticCacheFullBuildJob
* Check for startAfter param and do some sanity checking
- *
- * @param HTTPRequest $request
- * @return bool
*/
- public function run($request)
+ protected function execute(InputInterface $input, HybridOutput $output): int
{
$job = Injector::inst()->create(StaticCacheFullBuildJob::class);
$signature = $job->getSignature();
@@ -42,20 +45,20 @@ public function run($request)
$existing = DataList::create(QueuedJobDescriptor::class)->filter($filter)->first();
if ($existing && $existing->exists()) {
- $this->log(sprintf(
+ $output->writeln(sprintf(
'There is already a %s in the queue, added %s %s',
StaticCacheFullBuildJob::class,
$existing->Created,
$existing->StartAfter ? 'and set to start after ' . $existing->StartAfter : ''
));
- return false;
+ return Command::FAILURE;
}
- if ($request->getVar('startAfter')) {
+ if ($input->getOption('startAfter')) {
$now = DBDatetime::now();
$today = $now->Date();
- $startTime = $request->getVar('startAfter');
+ $startTime = $input->getOption('startAfter');
// move to tomorrow if the starttime has passed today
if ($now->Time24() > $startTime) {
@@ -71,12 +74,12 @@ public function run($request)
// sanity check that we are in the next 24 hours - prevents some weird stuff sneaking through
if ($startAfter->getTimestamp() > $thisTimeTomorrow || $startAfter->getTimestamp() < $now->getTimestamp()) {
- $this->log('Invalid startAfter parameter passed. Please ensure the time format is HHmm e.g. 1300');
+ $output->writeln('Invalid startAfter parameter passed. Please ensure the time format is HHmm e.g. 1300');
- return false;
+ return Command::INVALID;
}
- $this->log(sprintf(
+ $output->writeln(sprintf(
'%s queued for %s %s.',
StaticCacheFullBuildJob::class,
$startAfter->format('H:m'),
@@ -84,7 +87,7 @@ public function run($request)
));
} else {
$startAfter = null;
- $this->log(StaticCacheFullBuildJob::class . ' added to the queue for immediate processing');
+ $output->writeln(StaticCacheFullBuildJob::class . ' added to the queue for immediate processing');
}
$job->setJobData(0, 0, false, new \stdClass(), [
@@ -92,12 +95,13 @@ public function run($request)
]);
QueuedJobService::singleton()->queueJob($job, $startAfter ? $startAfter->format('Y-m-d H:i:s') : null);
- return true;
+ return Command::SUCCESS;
}
- protected function log($message)
+ public function getOptions(): array
{
- $newLine = Director::is_cli() ? PHP_EOL : '
';
- echo $message . $newLine;
+ return [
+ new InputOption('startAfter', null, InputOption::VALUE_REQUIRED, 'Delay execution until this time. Must be in 24hr format e.g. 1300'),
+ ];
}
}