Я, используя 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
@djkevino Если есть приемлемый ответ, вам нужно принять его очень скоро, иначе ваши награды исчезнут в черной дыре ...






Честно говоря, изрядно сбил с толку этот код. Материал 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 ));
Как указано в моем комментарии, не уверен, что эта роль, не имеющая «разрешений», считается допустимым состоянием или нет.
Похоже, что $ role-> getPermissions () может вернуть результат null. Итак, перед выполнением внутреннего цикла null убедитесь, что результат не foreach.
Поскольку вы, похоже, проверяете, имеет ли любой ролей пользователя желаемое разрешение, вам вообще не нужна переменная $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;
}
Подсказывает мне, что одна из ролей не имеет ничего назначенного с точки зрения разрешений. Это действительное состояние? Ошибка очевидна, невозможно выполнить метод с нулевым значением. Что на самом деле меня бросило в глаза, так это то, что на
$allowed = true;нет разрыва петли. Разве вы не захотели бы в этот момент выйти из цикла?