buzzingpixel/craft-scheduler

在Craft中安排任务运行

安装: 208

依赖项: 0

建议者: 0

安全性: 0

星星: 0

观察者: 0

分支: 0

开放问题: 0

类型:craft-plugin

1.0.0 2021-10-02 18:50 UTC

This package is auto-updated.

Last update: 2024-09-13 22:46:29 UTC


README

如果你想在Craft CMS中编程安排任务运行,这个模块就是为你准备的!只需设置一个cron,每分钟调用一次命令,然后通过挂钩到事件安排的任何内容都将按你定义的计划运行。

以下是使用方法

  1. 在你的Craft项目中运行 composer require buzzingpixel/craft-scheduler
  2. 然后运行 php craft plugin/install craft-scheduler
  3. 现在挂钩到 RetrieveSchedule 事件来添加到计划中的项目

RetrieveSchedule 事件

RetrieveSchedule 事件是添加运行者到计划的方式。以下是一个示例

use BuzzingPixel\CraftScheduler\ScheduleRetrieval\RetrieveSchedule;
use BuzzingPixel\CraftScheduler\ScheduleRetrieval\RetrieveScheduleEvent;
use BuzzingPixel\CraftScheduler\ScheduleRetrieval\ScheduleConfigItem;
use BuzzingPixel\CraftScheduler\Frequency;
use yii\base\Event;

Event::on(
    RetrieveSchedule::class,
    RetrieveSchedule::EVENT_RETRIEVE_SCHEDULE,
    static function (RetrieveScheduleEvent $e): void {
        $e->scheduleConfigItems()->addItem(item: new ScheduleConfigItem(
            className: SomeClass::class, // The class to run
            runEvery: Frequency::ALWAYS, // How often to run it
            method: 'myOptionalMethod', // Specify method on the class to call, defaults to __invoke
            resolveWith: SomeContainer::class, // Optionally provide your own ContainerInterface implementation. Defaults to the Yii container (or whatever default container you specify, see below)
        ));

        $e->scheduleConfigItems()->addItem(item: new ScheduleConfigItem(
            className: SomeOtherClass::class,
            runEvery: Frequency::HOUR,
        ));
    }
);

SetDefaultContainer 事件

调度器允许你提供自己的ContainerInterface实现作为默认值。如果没有指定默认值,Craft Scheduler将使用Yii Container实现(围绕Yii容器包装,实现PSR ContainerInterface)。

use BuzzingPixel\CraftScheduler\CraftSchedulerPlugin;
use BuzzingPixel\CraftScheduler\ScheduleRetrieval\SetDefaultContainerEvent;
use DI\ContainerBuilder;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ResponseInterface;
use Slim\App;
use Slim\Psr7\Factory\ResponseFactory;
use yii\base\Event;

use function DI\autowire;

Event::on(
    CraftSchedulerPlugin::class,
    CraftSchedulerPlugin::EVEN_SET_DEFAULT_CONTAINER,
    static function (SetDefaultContainerEvent $e) {
        $containerBuilder = (new ContainerBuilder())
            ->useAnnotations(true)
            ->useAutowiring(true)
            ->ignorePhpDocErrors(true)
            ->addDefinitions([
                ResponseFactoryInterface::class => autowire(ResponseFactory::class),
            ]);
        
        $container = $containerBuilder->build();

        $e->setDefaultContainer($container);
    }
);