插入后运行php脚本

时间:2018-04-25 08:35:03

标签: symfony

我正在使用Symfony 3和Twig模板开发应用程序。我使用symfony formBuilder创建了表单。每次在数据库中插入一行时,我都需要运行一个php脚本。无论如何我能做到这一点吗?

2 个答案:

答案 0 :(得分:2)

是的,当然,您可以使用事件和事件监听器https://symfony.com/doc/current/event_dispatcher.html或Doctrine事件监听器和订户https://symfony.com/doc/current/doctrine/event_listeners_subscribers.html

答案 1 :(得分:1)

首先,要运行脚本,您可以使用Process component of Symfony

以下是一个使用示例:

$phpBinaryFinder = new PhpExecutableFinder();
$phpBinaryPath = $phpBinaryFinder->find();

$process = new Process("{$phpBinaryPath} worker.php");
$process->run();

您应该阅读相关的doc以获取更多见解。

然后你想在刷新教义之后挂钩,然后使用事件监听器。它是一个具有您注册为服务的特定方法的类。

您需要定义一个类:

namespace App\EventListener;

use Doctrine\ORM\Event\PostFlushEventArgs;
use Doctrine\ORM\Event\LifecycleEventArgs;

class YourListener
{
    private $persisted = [];
    public function postPersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if (!$entity instanceof YourRecord) {
            return;
        }

        $this->persisted[] = $entity;
    }

    public function postFlush(PostFlushEventArgs $args)
    {
        foreach ($persisted as $row) {
            // Execute your action for the given row
        }
    }
}

然后您需要将其注册为服务:

# services.yaml
services:
    App\EventListener\YourListener:
        tags:
            - { name: doctrine.event_listener, event: postPersist }
            - { name: doctrine.event_listener, event: postFlush }

查看相关文档:https://symfony.com/doc/current/doctrine/event_listeners_subscribers.html