【问题标题】:CakePHP 3 - array_merge(): Argument #2 is not an arrayCakePHP 3 - array_merge():参数 #2 不是数组
【发布时间】:2015-12-01 20:25:15
【问题描述】:

我正在开发的一个 CakePHP 3 应用程序出现一个奇怪的错误,我无法弄清楚问题是什么。应用程序和问题如下:

  1. 我有一个愿望清单
  2. 该愿望清单可以有许多愿望清单项目
  3. 我正在使用 Angular/Ajax 拨打电话并删除 WishlistItem

    http://domain.com/wishlist_items/delete/219
    
  4. 这不起作用,它返回以下错误:

    array_merge(): Argument #2 is not an array 
    
    /­vendor/­cakephp/­cakephp/­src/­ORM/­Association/­DependentDeleteTrait.php 54
    
  5. 有问题的WishlistItemsController.php 是:

    public function delete($id = null) {
        $this->autoRender = false;
    
        $this->request->allowMethod(['post', 'delete']);
        $wishlistItem = $this->WishlistItems->get($id);
    
        if ($this->WishlistItems->delete($wishlistItem)) {
            echo json_encode(['message' => ['type' => 'success', 'text' => 'This wishlist item has been deleted successfully']]);
        }
        else {
            echo json_encode(['message' => ['type' => 'error', 'text' => 'This wishlist item could not be deleted']]);
        }
        return;
     }
    
  6. 愿望清单项目没有依赖项,错误来自此文件http://api.cakephp.org/3.0/source-class-Cake.ORM.Association.DependentDeleteTrait.html#19-57 第 54 行

  7. 我的表格文件如下所示:

    WishlistsTable.php
    
    $this->hasMany('WishlistItems', [
        'foreignKey' => 'wishlist_id',
        'dependent' => true,
        'cascadeCallbacks' => true,
    ]);
    
    ==================================================
    
    WishlistItemsTable.php
    
    $this->addBehavior('Timestamp');
    $this->addBehavior('Ratings.Ratable');
    $this->belongsTo('Wishlists', [
        'foreignKey' => 'wishlist_id'
    ]);
    
    $this->addBehavior('CounterCache', [
        'Wishlists' => ['items_count']
    ]);
    

我不明白为什么在此表没有任何依赖项时使用cascadeDelete 函数。

堆栈跟踪:

Whoops\Exception\ErrorException thrown with message "array_merge(): Argument #2 is not an array"

Stacktrace:
#15 Whoops\Exception\ErrorException in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/ORM/Association/DependentDeleteTrait.php:54
#14 Whoops\Run:handleError in /var/www/domain.com/dev/website/vendor/gourmet/whoops/src/Error/WhoopsHandler.php:27
#13 Gourmet\Whoops\Error\WhoopsHandler:_displayError in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/Error/BaseErrorHandler.php:139
#12 Cake\Error\BaseErrorHandler:handleError in <#unknown>:0
#11 array_merge in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/ORM/Association/DependentDeleteTrait.php:54
#10 Cake\ORM\Association\HasMany:cascadeDelete in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/ORM/AssociationCollection.php:273
#9 Cake\ORM\AssociationCollection:cascadeDelete in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/ORM/Table.php:1705
#8 Cake\ORM\Table:_processDelete in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/ORM/Table.php:1643
#7 Cake\ORM\Table:Cake\ORM\{closure} in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/Database/Connection.php:557
#6 Cake\Database\Connection:transactional in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/ORM/Table.php:1648
#5 Cake\ORM\Table:delete in /var/www/domain.com/dev/website/src/Controller/WishlistItemsController.php:139
#4 App\Controller\WishlistItemsController:delete in <#unknown>:0
#3 call_user_func_array in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/Controller/Controller.php:429
#2 Cake\Controller\Controller:invokeAction in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/Routing/Dispatcher.php:114
#1 Cake\Routing\Dispatcher:_invoke in /var/www/domain.com/dev/website/vendor/cakephp/cakephp/src/Routing/Dispatcher.php:87
#0 Cake\Routing\Dispatcher:dispatch in /var/www/domain.com/dev/website/webroot/index.php:37

【问题讨论】:

  • 请始终添加属于错误的完整堆栈跟踪,这有助于弄清楚到底发生了什么。
  • 谢谢!我已经添加了 Stacktrace。

标签: cakephp model associations cakephp-3.0 cascade


【解决方案1】:

如果在您调用delete() 的表对象上真的只有BelongsTo 关联,那么这种控制流永远不会发生,因此需要从其他地方定义更多关联。

鉴于 Ratings.Ratable 行为属于 dereuromark/cakephp-ratings,我怀疑问题在于为 HasMany 关联定义的条件,该行为添加到表中:

https://github.com/dereuromark/cakephp-ratings/.../Behavior/RatableBehavior.php#L85

$this->_table->hasMany('Ratings', [
        'className' => $this->_config['rateClass'],
        'foreignKey' => $this->_config['foreignKey'],
        'unique' => true,

        'conditions' => '', // <<<<<< There it is

        'fields' => '',
        'dependent' => true,
        //'table' => 'sandbox_ratings'
    ]
);

该值最终作为DependentDeleteTrait::cascadeDelete() 中的第二个参数传递给array_merge(),因此出现错误。

所以,这是插件中的一个错误,我建议您报告它。作为一种快速解决方法,您可以覆盖表类中的条件,例如

$this->association('Ratings')->conditions([]);

【讨论】:

  • 感谢您如此透彻的解释和愿意提供帮助的意愿。你是绝对正确的!在故障排除过程中,我删除了这一行 $this-&gt;addBehavior('Ratings.Ratable'); 并且由于问题继续存在,我认为它没有任何问题。但是,我没有注意到我已将其作为组件添加到 WishlistItemsController.php 文件中,并且 Ratings.Ratings 组件会自动加载帮助程序和行为。您的快速解决方法现在就可以了,我会将这个问题报告给 Ratings 插件的创建者。非常感谢!
  • 插件创建者很快就修复了。现在 Ratings 插件可以正常工作而不会引发任何错误。再次感谢您抓住这一点。 github.com/dereuromark/cakephp-ratings/issues/3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2020-10-28
相关资源
最近更新 更多