升级到PHP 7.1后,Cakephp 3.x afterSave()回调返回500错误

时间:2017-05-06 11:27:54

标签: php cakephp cakephp-3.0

我最近将我的MAMP服务器更新为PHP 7.1并使用Cakephp 3.x构建了一个项目。但是当我使用afterSave()回调时,我收到一个奇怪的500(内部服务器错误)错误。

文档lifecycle-callbacks描述了以下内容:

public function afterSave(Event $event, EntityInterface $entity, ArrayObject $options) {
   // some action 
}

当我使用PHP 7.1时,它会给我一个500错误,但如果我使用PHP 5.6它将适用于我。

现在我已经通过不再定义函数内部的类型来修复PHP 7.1上的这500个错误。但这是正确的方法吗?

public function afterSave($event, $entity, $options) { 
   // some action 
}

更新

我的错误日志说:

  

2017-05-06 13:38:09错误:[TypeError]参数1传递给   库库\型号\表\ StoragecontainerBlockElementsTable :: afterSave()   必须是Storages \ Model \ Table \ Event的实例,实例   Cake \ Event \ Event给出,调用   /Applications/MAMP/htdocs/safebend-community-data-center/community/vendor/cakephp/cakephp/src/Event/EventManager.php   在414行请求URL:/ storages / blocks / dsdsdsd / ajaxAddElement   推荐人网址:   http://localhost:8888/safebend-community-data-center/community/storages/blocks/dsdsdsd

My Table with namespace:

namespace Storages\Model\Table;

use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Cake\ORM\TableRegistry;

class StoragecontainerBlockElementsTable extends Table { 
    public function afterSave(Event $event, EntityInterface $entity, ArrayObject $options) { 
        // some action
    }
}

我的带命名空间的控制器:

namespace Storages\Controller;

use App\Controller\AppController;
use Cake\Log\Log;
use Cake\ORM\TableRegistry;

class StoragecontainerBlocksController extends AppController { }

1 个答案:

答案 0 :(得分:2)

您还没有导入使用过的名称,因此Event将引用当前名称空间,即参数将被输入\Storages\Model\Table\Event而不是预期的\Cake\Event\Event。另外两个论点存在同样的问题。

导入类名,你应该做得很好:

use ArrayObject;
use Cake\Datasource\EntityInterface;
use Cake\Event\Event;

如果不这样做会导致任何PHP版本中的错误(假设正在调用该方法)。