Вызов функции-члена keys() при null в vendor/cakephp/cakephp/src/ORM/Table.php , строка 2625

#php #cakephp #cakephp-3.7

#php #cakephp #cakephp-3.7

Вопрос:

Я создал новый контроллер для сохранения планов подписки для моего веб-сайта. Я пытаюсь создать новую запись через таблицу моделей, но получаю сообщение об ошибке: Call to a member function keys() on null in vendor/cakephp/cakephp/src/ORM/Table.php, line 2625 .

Код, который я пытаюсь выполнить, является.

 namespace SubscriptionPlansModelTable;


use AppModelTableAppTable;
use CakeChronosChronos;
use CakeDatasourceConnectionInterface;
use CakeDatasourceConnectionManager;
use CakeDatasourceEntityInterface;
use SubscriptionPlansModelEntityPartnerPlan;
use SubscriptionPlansModelEntityPartnerPlanSubscription;
use SubscriptionPlansServicesPeriod;

class PartnerPlanSubscriptionsTable extends AppTable
{
    /** @var ConnectionInterface  */
    public $_connection;

    public function __construct($arg)
    {
        parent::__construct($arg);
        $this->_connection = ConnectionManager::get('default');
    }

    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->addBehavior('Timestamp', [
            'events' => [
                'Model.beforeSave' => [
                    'created_at' => 'new',
                    'updated_at' => 'always',
                ]
            ]
        ]);
    }


    public function create($partnerId, $subscriptionPlan, $interval = 'year', $intervalCount = 1, $startDate = null): EntityInterface
    {
        // If the $subscriptionPlan is a PartnerPlan entity, grab the id.
        $planId = ($subscriptionPlan instanceof PartnerPlan) ? $subscriptionPlan->id : $subscriptionPlan;

        // Create a new date period based on the provided create params
        $period = new Period($interval, $intervalCount, $startDate);

        /** @var PartnerPlanSubscription $subscription */
        $subscription = $this->newEntity([
            'partner_id' => $partnerId,
            'partner_plan_id' => $planId,
            'starts_at' => $period->getStartDate()->toDateTimeString(),
            'ends_at' => $period->getEndDate()->toDateTimeString()
        ]);

        return $this->save($subscription);
    }
}
 

Я вижу vendor/cakephp/cakephp/src/ORM/Table.php:2625 , что ожидается какая-то associated опция, но я ничего не могу найти в документации по этому поводу.

Комментарии:

1. Строка 2625 в таблице в основном $options['associated'] = $this->_associations->keys(); ? Если это так, то каким-то образом ваша таблица не была сконструирована должным образом, потому что именно тогда _associations устанавливается значение. Посмотрите вверх по течению на AppTable, чтобы убедиться, что он вызывает конструктор Table. Или, может быть, что-то обычное очищает _associations до null после построения? Итог это не обычная проблема с библиотекой CakePHP, это что-то в вашем коде, что связано с обычными _associations значениями, это всегда должно быть AssociationCollection

2. Спасибо, я посмотрю 🙂 Работаю над новым командным проектом и не уверен, что именно я унаследовал. @ахоффнер

Ответ №1:

Это старый вопрос, но это может помочь другим.

Я столкнулся с такой же проблемой с PHP 8.0.13 и XDebug. Похоже, это связано с несовместимостью XDebug с __debugInfo() упомянутым в https://github.com/cakephp/chronos/issues/164 . Я отключил расширение XDebug, и ошибка волшебным образом исчезла.