setono/cron-expression-bundle
Symfony bundle integrating dragonmantank/cron-expression. Provides a CronExpression form field and a Doctrine DBAL type to store Cron\CronExpression in entities, making it easy to validate, edit, and persist cron schedules in your app.
Installation:
composer require setono/cron-expression-bundle
First Use Case:
CronExpressionType to a form to validate and render cron expressions:
use Setono\CronExpressionBundle\Form\Type\CronExpressionType;
$builder->add('schedule', CronExpressionType::class);
Database Integration:
CronExpressionType Doctrine DBAL type for storing cron expressions in your database:
use Setono\CronExpressionBundle\Doctrine\DBAL\Types\CronExpressionType;
#[ORM\Column(type: CronExpressionType::CRON_EXPRESSION_TYPE)]
private CronExpression $schedule;
Setono\CronExpressionBundle\Form\Type\CronExpressionTypeSetono\CronExpressionBundle\Doctrine\DBAL\Types\CronExpressionTypeBasic Usage:
$builder->add('cron_field', CronExpressionType::class);
* * * * *).Customization:
$builder->add('cron_field', CronExpressionType::class, [
'error_bubbling' => true,
'validation_message' => 'Invalid cron expression: {{ value }}',
]);
$builder->add('cron_field', CronExpressionType::class, [
'attr' => ['placeholder' => 'e.g., * * * * *'],
]);
Dynamic Forms:
CronExpressionType in dynamic forms (e.g., Symfony UX Live Component) for real-time validation.Storing Cron Expressions:
#[ORM\Column(type: CronExpressionType::CRON_EXPRESSION_TYPE)]
private CronExpression $schedule;
string (e.g., "0 0 * * *") and CronExpression objects.Querying:
CronExpression object in repositories to evaluate schedules:
$expression = new CronExpression($entity->getSchedule());
if ($expression->isDue()) {
// Execute logic
}
Migrations:
$this->addColumn('tasks', 'schedule', 'cron_expression');
Symfony Validator:
"invalid") trigger validation errors automatically.Custom Validation:
use Symfony\Component\Validator\Constraints as Assert;
#[Assert\CronExpression]
private string $schedule;
# config/validator/validation.yaml
Setono\CronExpressionBundle\Validator\Constraints\CronExpression:
message: 'The cron expression "{{ value }}" is invalid.'
Time Zone Handling:
$expression = new CronExpression($cronString, new \DateTimeZone('America/New_York'));
Unit Testing Forms:
$form = $this->factory->create(TaskType::class);
$form->submit('invalid');
$this->assertFalse($form->isValid());
Database Tests:
$connection = $this->getConnection();
$connection->insert('tasks', ['schedule' => '0 0 * * *']);
$result = $connection->fetchAssociative('SELECT schedule FROM tasks');
$this->assertInstanceOf(CronExpression::class, $result['schedule']);
Scheduling Logic:
$expression = new CronExpression('0 0 * * *');
$this->assertTrue($expression->isDue(new \DateTime('2023-01-01 00:00:00')));
Invalid Cron Expressions:
"*"). Handle edge cases in your form:
$builder->add('schedule', CronExpressionType::class, [
'error_bubbling' => true,
]);
"* * * * *") for required fields.Doctrine DBAL Type Conflicts:
setono/cron-expression-bundle@^1.7 for compatibility.AppKernel:
$this->registerDoctrineType(CronExpressionType::CRON_EXPRESSION_TYPE);
Time Zone Mismatches:
#[ORM\Column]
private string $timezone = 'UTC';
DateTimeImmutable with explicit time zones in business logic.Symfony 4 Deprecation:
^1.6.Validation Errors:
$errors = $form->getErrors();
foreach ($errors as $error) {
dump($error->getMessage());
}
* * * * * * (5 or 6 fields).Database Serialization:
$connection->getDatabasePlatform()->getDoctrineTypeMapping()[CronExpressionType::CRON_EXPRESSION_TYPE];
php bin/console cache:clear) after adding the type.Performance:
CronExpression objects:
private static $cachedExpressions = [];
$expression = self::$cachedExpressions[$cronString] ?? new CronExpression($cronString);
Custom Form Types:
CronExpressionType to add features like:
class ExtendedCronExpressionType extends CronExpressionType {
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'presets' => ['daily' => '0 0 * * *'],
]);
}
}
Custom Validators:
use Setono\CronExpressionBundle\Validator\Constraints\CronExpression;
#[Assert\CronExpression]
#[Assert\Expression(
"value.isDue(new \DateTime('now')) || value.isDue(new \DateTime('now +1 hour'))",
message: "Schedule must run within the next hour."
)]
private string $schedule;
Doctrine Events:
$entityManager->getEventManager()->addEventListener(
ORM\Events::prePersist,
function (ORM\PrePersistEventArgs $args) {
$entity = $args->getObject();
if ($entity instanceof Task) {
// Log or validate cron expression changes
}
}
);
bundles.php includes:
Setono\CronExpressionBundle\SetonoC
How can I help you explore Laravel packages today?