找不到cakephp事件监听器

时间:2016-08-18 11:59:34

标签: cakephp event-handling cakephp-3.2

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

默认情况下,图像的路径如下

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

每次将新行插入到同一个表中时,将通过其主键创建一个新文件夹。

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

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

我正在使用事件监听器,如在proffer文档中给出的那样。

这是我的 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;
    }
}

但这会导致致命错误

  

错误:未捕获错误:找不到类'App \ Model \ Table \ App \ Event \ UploadFileNameListener'   /var/www/html/projects/admin/src/Model/Table/SellersTable.php:23

1 个答案:

答案 0 :(得分:1)

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

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