code: protected function checkAccessRecursive($user, $itemName, $params, $assignments)
      {
          if (!isset($this->items[$itemName])) {
              return false;
          }
  
          /* @var $item Item */
          $item = $this->items[$itemName];
          Yii::debug($item instanceof Role ? "Checking role: $itemName" : "Checking permission : $itemName", __METHOD__);
  
          if (!$this->executeRule($user, $item, $params)) {
              return false;
          }
  
          if (isset($assignments[$itemName]) || in_array($itemName, $this->defaultRoles)) {
              return true;
          }
  
          foreach ($this->children as $parentName => $children) {
              if (isset($children[$itemName]) && $this->checkAccessRecursive($user, $parentName, $params, $assignments)) {
                  return true;
              }
          }
  
          return false;
      }
docs: Performs access check for the specified user.
  This method is internally called by [[checkAccess()]].
  
  @param string|int $user the user ID. This should can be either an integer or a string representing
  the unique identifier of a user. See [[\yii\web\User::id]].
  @param string $itemName the name of the operation that need access check
  @param array $params name-value pairs that would be passed to rules associated
  with the tasks and roles assigned to the user. A param with name 'user' is added to this array,
  which holds the value of `$userId`.
  @param Assignment[] $assignments the assignments to the specified user
  @return bool whether the operations can be performed by the user.