W Laravelu nazywało się to route model binding, w Symfony mówią na to auto-wiring, mechanizm ten sam, poznajemy jak to działa.

Ok, musimy doimportować enityty:

use App\Repository\MicroPostRepository;
use App\Entity\MicroPost;

Teraz upraszczamy metodę:

#[Route('/micro_post/{post}', name: 'app_micro_post_show')]
    public function showOne(MicroPost $post): Response
    {
        return $this->render('micro_post/single.html.twig', ['post' => $post]);
    }

Już teraz będzie nam działać, ale w index musimy jeszcze linki poprawić, aby nazwa parametru się zgadzała (post, nie id od teraz):

{% extends 'base.html.twig' %}

{% block title %}Hello MicroPostController!{% endblock %}

{% block body %}
<style>
    .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
    .example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
</style>

<div class="example-wrapper">
    {% if posts|length > 0 %}
    {% for post in posts %}
      <h3><a href="{{ path('app_micro_post_show', { post: post.id }) }}">{{ post.title }}<a/></h3>
      <p>{{post.content}}</p>
    {% endfor %}
  {% else %}
            <p>No posts</p>
    {% endif %}
</div>
{% endblock %}

Jak w Laravelu to robiliśmy (route model binding) to jesteśmy w domu. Jak nie uczyliśmy się Laravela, cóż, polecam najpierw się go nauczyć, bo Symfony to framework minimalnie trudniejszy.