1

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

默认图片的路径如下

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

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

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

/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;
    }
}

并在中创建UploadFileNameListener.phpsrc/Event/

<?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;
    }
}

但这是给致命错误

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

4

1 回答 1

1

从错误消息中,很明显它正在尝试使用相对于当前类的命名空间的命名空间加载类。尝试

$listener = new \App\Event\UploadFileNameListener();
于 2016-08-19T23:52:33.317 回答