如何在 cakephp4 中使用 Admad cakephp-glide 删除 Glide 缓存?

Posted

技术标签:

【中文标题】如何在 cakephp4 中使用 Admad cakephp-glide 删除 Glide 缓存?【英文标题】:how to delete Glide cache using Admad cakephp-glide in cakephp4? 【发布时间】:2022-01-03 20:56:15 【问题描述】:

我在我的 Cakephp4 应用程序中使用插件 cakephp-glide。

我想在图像被删除后立即删除图像的 Glide 缓存。

我的插件FileManager在删除图像文件时触发事件'afterDelete':

// in FileManager.FichiersTable
public function afterDelete(Event $event, EntityInterface $entity, ArrayObject $options)

    $fichier = new File(WWW_ROOT . $entity->url);
    $fichier->delete();

    $afterDeleteEvent = new Event('FileManager.Fichiers.afterDelete', $this, [
        'file' => $entity
    ]);
    $this->getEventManager()->dispatch($afterDeleteEvent);

我想在我的应用程序的引导程序中捕获事件以删除图像的缓存:

//in bootstrap.php
EventManager::instance()
    ->on(
        'FileManager.Fichiers.afterDelete',
        function (Event $event) 
            // Delete cache of $event->getData('file')
            $filename = $event->getData('file')->filename;
            $server->deleteCache($filename); // How to get the instance $server ???
        
    );

但是我不知道如何获取 Glide Server 实例?

我在插件中找不到获取它的方法。 如果有人可以帮助我...

【问题讨论】:

查看插件代码,服务器实例似乎永远不会离开中间件,甚至没有为每个请求创建它。我不知道自己实例化服务器是否是一个好主意,我从未使用过 Glide,所以我真的无法提供任何进一步的建议。你可能想在 Slack 中问这个问题,ADmad 有时也在那里,或者如果你认为这可能被认为是缺少功能,甚至可以在 GitHub 上创建一个问题。 【参考方案1】:

根据 ADmad 建议,解决方案是将 Glide 服务器配置存储在 Configure 中,然后在 ADmad/Glide 插件配置的路由和我的事件侦听器中使用此配置来创建新的服务器实例。

//in bootstrap.php
//'ADmad/Glide.server' will be used in routes to configure the plugin and in my event listener below to create a new server instance.
Configure::write('ADmad/Glide.server', [
            // Path or League\Flysystem adapter instance to read images from.
            // http://glide.thephpleague.com/1.0/config/source-and-cache/
            'source' => WWW_ROOT,

            // Path or League\Flysystem adapter instance to write cached images to.
            'cache' => WWW_ROOT . 'files' . DS . 'cache',

            // URL part to be omitted from source path. Defaults to "/images/"
            // http://glide.thephpleague.com/1.0/config/source-and-cache/#set-a-base-url
            'base_url' => '/images/',

            // Response class for serving images. If unset (default) an instance of
            // \ADmad\Glide\Response\PsrResponseFactory() will be used.
            // http://glide.thephpleague.com/1.0/config/responses/
            'response' => null,
        ]);

EventManager::instance()
    ->on(
        'FileManager.Fichiers.afterDelete',
        function (Event $event) 
            $server = \League\Glide\ServerFactory::create(Configure::read('ADmad/Glide.server')); // Use the Glide server config above
            $file = $event->getData('file');
            $server->deleteCache(Configure::read('ADmad/Glide.server.base_url') . $file->url);

        
    );
    
);

【讨论】:

以上是关于如何在 cakephp4 中使用 Admad cakephp-glide 删除 Glide 缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp 3.x ADmad/JwtAuth MissingRouteException

如何从 Cakephp4 中的 Helper 获取 $this->request->getAttribute('csrfToken')?

在 hasMany 中依赖 true 不能在 cakephp4 中的子节点上工作

CakePHP4 Ajax:从控制器发送到视图

cakephp4 测试标题长度

FormHelper::getSourceValue() 在 CakePHP4 中的验证错误时不返回实体