Programatically render a block in a twig template I need to render a views block in my page.html.twig template. In D7 I would do this:

&lt;?php
  $block = module_invoke('module_name', 'block_view', 'block_delta');
  print render($block['content']);
?&gt;


In Drupal 8 module_invoke is deprecated and recommended to use this: (I've added the block's name as the second parameter)

Drupal::moduleHandler()-&gt;invoke($block, 'views_block__blog_block_1', $args = array());


I tried a few things. First tried to do it in a twig template but I don't know how to call php functions in a twig template, so that didn't turn out too well.

Then I called the function in the preprocess_page() function in the .theme file but before I could get it to work I tried something simpler just to try make a variable work inside the twig template which didn't work either, for example:

In the template_preprocess_page(&amp;$vars) function in the .theme file:

$test = 'Hello World';
$vars['$my_var'] = $test;


I tried to call my_var inside the twig template but it didn't work and I got an error message saying "The site has an error, please contact the administrator"

So, to summarize, here are my questions:


How do I make variables available inside twig templates?
How do I call functions inside twig templates?
Do I render blocks inside the .theme file or twig template?
You're on the wrong track with module_invoke(). That's just a fancy way of calling the {$module_name}_block_view() function.

The fact that it changed doesn't matter, the point is that the block system completely changed in 8.x and is now using plugins and config entities, those functions no longer exist.

You have a few options.

a) Re-use an existing block config entity and view it. Very easy, but requires that configuration to exist, e.g. as a disabled block.

$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
  -&gt;getViewBuilder('block')
  -&gt;view($block);


b) Create the block plugin instance directly, pass it the configuration (you can find the block plugin id and configuration easily in an exported block config entity). The downside is that you don't get render caching, but if you display it somewhere that is already cached (like a node template), that doesn't really matter.

$variables['block_output'] = \Drupal::service('plugin.manager.block')
  -&gt;createInstance($plugin, $configuration)
  -&gt;build();


c) In case of a view, you can also load the view directly and display it.

d) You can also re-think your approach completely and use block regions or Page Manager (which uses standard block plugins in 8.x).