Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
44.44% |
4 / 9 |
CRAP | |
71.43% |
15 / 21 |
| AccessAwareRouter | |
0.00% |
0 / 1 |
|
44.44% |
4 / 9 |
13.82 | |
71.43% |
15 / 21 |
| __construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
| __call | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| setContext | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getContext | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| matchRequest | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
| checkAccess | |
100.00% |
1 / 1 |
3 | |
100.00% |
6 / 6 |
|||
| getRouteCollection | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| generate | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| match | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\Routing\AccessAwareRouter. | |
| */ | |
| namespace Drupal\Core\Routing; | |
| use Drupal\Core\Access\AccessManagerInterface; | |
| use Drupal\Core\Session\AccountInterface; | |
| use Symfony\Cmf\Component\Routing\ChainRouter; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | |
| use Symfony\Component\Routing\RequestContext as SymfonyRequestContext; | |
| /** | |
| * A router class for Drupal with access check and upcasting. | |
| */ | |
| class AccessAwareRouter implements AccessAwareRouterInterface { | |
| /** | |
| * The chain router doing the actual routing. | |
| * | |
| * @var \Symfony\Cmf\Component\Routing\ChainRouter | |
| */ | |
| protected $chainRouter; | |
| /** | |
| * The access manager. | |
| * | |
| * @var \Drupal\Core\Access\AccessManagerInterface | |
| */ | |
| protected $accessManager; | |
| /** | |
| * The account to use in access checks. | |
| * | |
| * @var \Drupal\Core\Session\AccountInterface; | |
| */ | |
| protected $account; | |
| /** | |
| * Constructs a router for Drupal with access check and upcasting. | |
| * | |
| * @param \Symfony\Cmf\Component\Routing\ChainRouter $chain_router | |
| * The chain router doing the actual routing. | |
| * @param \Drupal\Core\Access\AccessManagerInterface $access_manager | |
| * The access manager. | |
| * @param \Drupal\Core\Session\AccountInterface $account | |
| * The account to use in access checks. | |
| */ | |
| public function __construct(ChainRouter $chain_router, AccessManagerInterface $access_manager, AccountInterface $account) { | |
| $this->chainRouter = $chain_router; | |
| $this->accessManager = $access_manager; | |
| $this->account = $account; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function __call($name, $arguments) { | |
| // Ensure to call every other function to the chained router. | |
| // @todo Sadly does the ChainRouter not implement an interface in CMF. | |
| return call_user_func_array([$this->chainRouter, $name], $arguments); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function setContext(SymfonyRequestContext $context) { | |
| $this->chainRouter->setContext($context); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getContext() { | |
| return $this->chainRouter->getContext(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| * | |
| * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException | |
| * Thrown when access checking failed. | |
| */ | |
| public function matchRequest(Request $request) { | |
| $parameters = $this->chainRouter->matchRequest($request); | |
| $request->attributes->add($parameters); | |
| $this->checkAccess($request); | |
| // We can not return $parameters because the access check can change the | |
| // request attributes. | |
| return $request->attributes->all(); | |
| } | |
| /** | |
| * Apply access check service to the route and parameters in the request. | |
| * | |
| * @param \Symfony\Component\HttpFoundation\Request $request | |
| * The request to access check. | |
| */ | |
| protected function checkAccess(Request $request) { | |
| // The cacheability (if any) of this request's access check result must be | |
| // applied to the response. | |
| $access_result = $this->accessManager->checkRequest($request, $this->account, TRUE); | |
| // Allow a master request to set the access result for a subrequest: if an | |
| // access result attribute is already set, don't overwrite it. | |
| if (!$request->attributes->has(AccessAwareRouterInterface::ACCESS_RESULT)) { | |
| $request->attributes->set(AccessAwareRouterInterface::ACCESS_RESULT, $access_result); | |
| } | |
| if (!$access_result->isAllowed()) { | |
| throw new AccessDeniedHttpException(); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getRouteCollection() { | |
| return $this->chainRouter->getRouteCollection(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH) { | |
| return $this->chainRouter->generate($name, $parameters, $referenceType); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| * | |
| * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException | |
| * Thrown when access checking failed. | |
| */ | |
| public function match($pathinfo) { | |
| return $this->matchRequest(Request::create($pathinfo)); | |
| } | |
| } | |