找不到 cakephp 事件侦听器

cakephp event listener not found

我正在使用 Cakephp 3.2 和 proffer 插件上传图片。

默认图片路径如下

/media/files/<tablename>/<primary_key>/<filename>

每次将新行插入同一个 table 时,都会根据其主键创建一个新文件夹。

我想将 table 的所有图像上传到同一目录。意味着像

这样的路径
/media/files/<tablename>/<filename>

我正在按照提供者文档中的说明使用事件侦听器。

这是我的SellersTable.php

<?php
namespace App\Model\Table;

use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Cake\Event\Event;

class SellersTable extends Table
{

    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */
    public function initialize(array $config)
    {
        parent::initialize($config);

        $listener = new App\Event\UploadFileNameListener(); // line 23
        $this->eventManager()->on($listener);

        $this->table('sellers');
        $this->displayField('id');
        $this->primaryKey('id');

        $this->addBehavior('Timestamp');
        $this->addBehavior('Proffer.Proffer', [
            'profile_picture' => [
                'root' => Configure::read('ArgoSystems.media.upload') . DS . 'files',
                'dir' => 'dir'
            ]
        ]);

    }

    /**
     * Default validation rules.
     *
     * @param \Cake\Validation\Validator $validator Validator instance.
     * @return \Cake\Validation\Validator
     */
    public function validationDefault(Validator $validator)
    {
        $validator
            ->integer('id')
            ->allowEmpty('id', 'create');

        $validator
            ->requirePresence('first_name', 'create')
            ->notEmpty('first_name');

        $validator
            ->requirePresence('last_name', 'create')
            ->notEmpty('last_name');

        $validator
            ->email('email')
            ->requirePresence('email', 'create')
            ->notEmpty('email')
            ->add('email', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);

        $validator->provider('proffer', 'Proffer\Model\Validation\ProfferRules');

        $validator
            ->add('profile_picture', 'proffer', [
              'rule' => ['dimensions', [
                'min' => ['w' => 100, 'h' => 500],
                'max' => ['w' => 100, 'h' => 500],
                ]],
                'message' => 'Image must be of 100 x 500 resolution',
                'provider' => 'proffer'
            ])
            ->requirePresence('profile_picture', 'create')
            ->allowEmpty('profile_picture','update');

        $validator
            ->requirePresence('password', 'create')
            ->notEmpty('password');

        return $validator;
    }

    public function buildRules(RulesChecker $rules)
    {
        $rules->add($rules->isUnique(['email']));

        return $rules;
    }
}

并在 src/Event/

中创建了 UploadFileNameListener.php
<?php
namespace App\Event;

use Cake\Event\Event;
use Cake\Event\EventListenerInterface;
use Cake\Utility\Inflector;
use Proffer\Lib\ProfferPath;

class UploadFileNameListener implements EventListenerInterface
{
    public function implementedEvents()
    {
        return [
            'Proffer.afterPath' => 'change',
        ];
    }

    /**
     * Rename a file and change it's upload folder before it's processed
     *
     * @param Event $event The event class with a subject of the entity
     * @param ProfferPath $path
     * @return ProfferPath $path
     */
    public function change(Event $event, ProfferPath $path)
    {
        // Detect and select the right file extension
        switch ($event->subject()->get('image')['type']) {
            default:
            case "image/jpeg":
                $ext = '.jpg';
                break;
            case "image/png":
                $ext = '.png';
                break;
            case "image/gif":
                $ext = '.gif';
                break;
        }

        // Create a new filename using the id and the name of the entity
        $newFilename = $event->subject()->get('id') . '_' . Inflector::slug($event->subject()->get('name')) . $ext;

        // set seed
        $path->setSeed('profile_picture');

        // Change the filename in both the path to be saved, and in the entity data for saving to the db
        $path->setFilename($newFilename);
        $event->subject('image')['name'] = $newFilename;

        // Must return the modified path instance, so that things are saved in the right place
        return $path;
    }
}

但是这是致命错误

Error: Uncaught Error: Class 'App\Model\Table\App\Event\UploadFileNameListener' not found in /var/www/html/projects/admin/src/Model/Table/SellersTable.php:23

从错误消息中可以看出,它正在尝试使用相对于当前 class 的命名空间的命名空间加载 class。尝试

$listener = new \App\Event\UploadFileNameListener();