Вызов функции-члена isCollection () в null - PullRequest
0 голосов
/ 12 июня 2018

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

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

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;
    }

Stacktrace:

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)

Выдает ошибку во 2-м цикле foreachна линии:

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

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

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

Ответы [ 2 ]

0 голосов
/ 28 июня 2018
  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;
}
0 голосов
/ 27 июня 2018

Честно говоря, довольно смущен этим кодом.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 ));

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

...