我最近将我的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 { }
答案 0 :(得分:2)
您还没有导入使用过的名称,因此Event
将引用当前名称空间,即参数将被输入\Storages\Model\Table\Event
而不是预期的\Cake\Event\Event
。另外两个论点存在同样的问题。
导入类名,你应该做得很好:
use ArrayObject;
use Cake\Datasource\EntityInterface;
use Cake\Event\Event;
如果不这样做会导致任何PHP版本中的错误(假设正在调用该方法)。