Given a route like this:
book:
path: /book
defaults:
page: 1
I would expect generate('book', {'page': $page}) to generate these routes:
/book when $page == 1
/book?page=2 when $page == 2
What actually happens is that when a parameter has a default value, but is not present in the route path, it just gets eaten by Symfony. Both of the above values for $page result in the path /page being generated.