1

I'm working on a D8 project trying to add custom access rules to some pages.

I want to restrict access to specific users based on their id.

I checked this and seems easy but I can't make it work!

I want to change the access for the route

entity.webform_submission.canonical /admin/structure/webform/manage/{webform}/submission/{webform_submission}

But as I didn't manage to make it work I tried an easier example

contact.site_page
/contact

(Which also doesn't work)

So I created my routing file under my_module/src/Routing folder :

namespace Drupal\my_module\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class RouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
    if ($route_item = $collection->get('contact.site_page')) {
      $requirements = $route_item->getRequirements();
      unset($requirements['_permission']);
      $route_item->setRequirement('_access', 'FALSE');
    }
  }
}

After that I added the service file in my_module's root folder:

services:
  my_module.route_subscriber:
    class: Drupal\my_module\Routing\RouteSubscriber
    tags:
      - { name: event_subscriber }

But I don't get Access denied when I visit those pages.

Also, is there any way to test it by using dsm or var_dump?

Any idea/help/suggestion is valuable!

Thank you in advance.

  • Yes, you can put var_dump($route_item) in alterRoutes(). You see the output when you clear the cache on the command line. – 4k4 Aug 23 '17 at 16:43
  • You're removing _permission from a local copy of the requirements array, not from the route object, could that be the problem? Try $requirements['_access'] = 'FALSE'; after the unset, and then $route_item->setRequirements($requirements); – Clive Aug 23 '17 at 18:51
  • @Clive, this is not the issue, setting _access to FALSE is all what is needed. Problem here seems to be to get the code running (on a cache clear, routes are not built in normal requests) – 4k4 Aug 23 '17 at 19:02
  • @4k4 Thanks, couldn't be bothered to check which had higher priority ;) – Clive Aug 23 '17 at 19:03
  • Thank you both. @4k4 yes that's the problem. I can't make it run. I cleared the caches but still nothing. I checked it in other modules (contributed) and it works but my code doesn't run. I checked the names and are correct, the module is enabled. I even added a var_dump('test') in the beginning of the function but still nothing. Any idea what else may I check? – Ismini Aug 24 '17 at 8:25
0

you need to enable kint() to get the routs but you need to make sure the permissions for using kint() is correct. and you can add your debugging into alterRouts()

  • Thank you @Ahmad. var_dump works fine. It was a caching issues I think. Also I had to free some space at my container. – Ismini Oct 30 '17 at 9:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.