Вызов функции-члена isCollection () при нулевом значении

Я, используя Graphaware Neo4j-php-OGM. Я хочу получить доступ ко второму уровню отношений. Я не вижу, чтобы он заработал. Что я делаю неправильно?

Я пытаюсь выполнить следующее:

public function allowToContinue($userUuid, $permissionUuid)
    {
        $userRepo = $this->entityManager->getRepository(User::class);
        $permRoleRepo = $this->entityManager->getRepository(PermRole::class);
        $permissionRepo = $this->entityManager->getRepository(Permission::class);
        $user = $userRepo->findOneBy(['uuid' => $userUuid]);
        $permission = $permissionRepo->findOneBy(['uuid' => $permissionUuid]);
        $allowed = false;
        foreach ($user->getPermrole() as $userRole)
        {
            var_dump($userRole);
            $role = $permRoleRepo->findOneBy(['uuid' => $userRole->getUuid()]);
            var_dump($role);
            foreach ($role->getPermissions() as $perm)
            {
                var_dump($perm->getUuid());
                if ($perm->getUuid() === $permissionUuid){
                    $allowed = true;
                }
            }
        }
        return $allowed;
    }

Трассировки стека:

Error:
Call to a member function isCollection() on null

  at vendor/graphaware/neo4j-php-ogm/src/Hydrator/EntityHydrator.php:107
  at GraphAware\Neo4j\OGM\Hydrator\EntityHydrator->hydrateSimpleRelationshipCollection('permissions', object(Result), object(neo4j_ogm_proxy_App_Entity_Generic_PermRole))
     (vendor/graphaware/neo4j-php-ogm/src/Persisters/BasicEntityPersister.php:104)
  at GraphAware\Neo4j\OGM\Persisters\BasicEntityPersister->getSimpleRelationshipCollection('permissions', object(neo4j_ogm_proxy_App_Entity_Generic_PermRole))
     (vendor/graphaware/neo4j-php-ogm/src/Proxy/NodeCollectionInitializer.php:22)
  at GraphAware\Neo4j\OGM\Proxy\NodeCollectionInitializer->initialize(object(Node), object(neo4j_ogm_proxy_App_Entity_Generic_PermRole))
     (vendor/graphaware/neo4j-php-ogm/src/Proxy/LazyCollection.php:52)
  at GraphAware\Neo4j\OGM\Proxy\LazyCollection->doInitialize()
     (vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php:332)
  at Doctrine\Common\Collections\AbstractLazyCollection->initialize()
     (vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php:274)
  at Doctrine\Common\Collections\AbstractLazyCollection->getIterator()
     (src/Security/RoleChecker.php:45)
  at App\Security\RoleChecker->allowToContinue('8d88d920-5ab0-11e8-a371-001c42dff143', 'd93370b0-585d-11e8-a371-001c42dff143')
     (src/Controller/Generic/UserController.php:146)
  at App\Controller\Generic\UserController->destroy('c34f1380-5ab5-11e8-a371-001c42dff143')
     (vendor/symfony/http-kernel/HttpKernel.php:149)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
     (vendor/symfony/http-kernel/HttpKernel.php:66)
  at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
     (vendor/symfony/http-kernel/Kernel.php:188)
  at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
     (public/index.php:37)

Это вызывает ошибку во втором цикле foreach в строке:

foreach ($role->getPermissions() as $perm)

Странно, с первого раза работает правильно, а не второй. Также после получения объекта снова, чтобы убедиться. Без этого он выдает точно такое же уведомление. Заранее спасибо!

Весь код находится на github: https://github.com/djkevino/Support4Neo

Подсказывает мне, что одна из ролей не имеет ничего назначенного с точки зрения разрешений. Это действительное состояние? Ошибка очевидна, невозможно выполнить метод с нулевым значением. Что на самом деле меня бросило в глаза, так это то, что на $allowed = true; нет разрыва петли. Разве вы не захотели бы в этот момент выйти из цикла?

ficuscr 27.06.2018 21:31

@djkevino Если есть приемлемый ответ, вам нужно принять его очень скоро, иначе ваши награды исчезнут в черной дыре ...

cybersam 29.06.2018 02:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
2
864
2

Ответы 2

Честно говоря, изрядно сбил с толку этот код. Материал var_dump() die() в destroy() ... Кроме того, мне потребовалось время, чтобы понять, что мы говорим о коде в библиотеке, а не о вашем коде, который взаимодействует с этой библиотекой.

Сможете ли вы таким образом избежать проблемы?

//add this next line
if (!is_iterable($user->getPermrole())) continue;
foreach ($role->getPermissions() as $perm)

Если вы не используете PHP версии 7.1 или выше, вы можете просто проверить, есть ли возвращаемое значение is_null, или проверить наличие instance of \Traversable и is_array ...

is_array($foo) || (is_object($foo) && ($foo instanceof \Traversable ));

Как указано в моем комментарии, не уверен, что эта роль, не имеющая «разрешений», считается допустимым состоянием или нет.

  1. Похоже, что $ role-> getPermissions () может вернуть результат null. Итак, перед выполнением внутреннего цикла null убедитесь, что результат не foreach.

  2. Поскольку вы, похоже, проверяете, имеет ли любой ролей пользователя желаемое разрешение, вам вообще не нужна переменная $allowed. Внутренний цикл foreach может сразу же вернуть true после обнаружения совпадения, избегая ненужной обработки.

То есть попробуйте это:

public function allowToContinue($userUuid, $permissionUuid) {
    $userRepo = $this->entityManager->getRepository(User::class);
    $permRoleRepo = $this->entityManager->getRepository(PermRole::class);
    $permissionRepo = $this->entityManager->getRepository(Permission::class);
    $user = $userRepo->findOneBy(['uuid' => $userUuid]);
    $permission = $permissionRepo->findOneBy(['uuid' => $permissionUuid]);        
    foreach ($user->getPermrole() as $userRole) {
        var_dump($userRole);
        $role = $permRoleRepo->findOneBy(['uuid' => $userRole->getUuid()]);
        var_dump($role);
        $rolePerms = $role->getPermissions();
        if (!is_null($rolePerms)) {
            foreach ($rolePerms as $perm) {
                var_dump($perm->getUuid());
                if ($perm->getUuid() === $permissionUuid) {
                    return true;
                }
            }
        }
    }
    return false;
}

Другие вопросы по теме