I'm creating a custom module. This module displays public custom content without node and views . For this content custom page , I would like to add dynamic meta keyword and meta description .

I have read this excellent answer How do I add a meta tag in <head>...</head> section? and it said we can use


and update variable


But the meta contents are getting in a controller's method. For this raison, I would like to pass the meta contents to mymodulename_page_attachments hook.

How can I call and update $page in my controller module to do this ? Or how can I generate meta in my controller ?

  • 1
    Move the logic into a service then use the service in both contexts (controller and hook). You can statically cache the results of the op if it’s expensive. Or maybe try attaching html_head to the render array you return from the controller and see if it bubbles up to the page layer (something tells me it will but I’m not sure) – Clive Feb 7 '18 at 9:59
  • tank's I didn't think to this. I will try . – Agriesean Feb 7 '18 at 12:29
  • @Clive than'ks . Your message told me what to do and what to learnt . ^^ – Agriesean Feb 8 '18 at 9:03

hook_page_attachments() is only needed so you can attach it to any possible route/url. You should be to just add it directly to the response that you re returning, and it should bubble up and be added.

| improve this answer | |
  • thank's to your response . I didn't understood realy what was Drupal Service. It's mistake . :-) – Agriesean Feb 8 '18 at 9:06

Service was the key to my problem .

After i understood Drupal services https://www.drupal.org/docs/8/api/services-and-dependency-injection/services-and-dependency-injection-in-drupal-8



It's easy to define dynamic keyword and meta to one page

function mymodulename_page_attachments(array &$page) {
    $currentUrl = Drupal::request()->get(Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_NAME); 
        case 'path_url': 
        //call my service 
          $description = array(
                '#tag' => 'meta',
                '#attributes' => array(
                    'property' => 'description',
                    'content' => /* value to my service return */,

            $page['#attached']['html_head'][] = [$description, 'description'];

| improve this answer | |

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.