Да все просто:
1) Простой пример
class a{ public function checkSmth($route) { if ($route=='test-a') die('Test A'); }}
class b{ public function checkSmth($route) { if ($route=='test-b') die('Test B'); }}
$middleware = ['a','b'];
$route = 'test-a'; // например тут будет $_SERVER['QUERY_STRING']
foreach($middleware as $m) (new $m)->checkSmth($route);
т.е. перебираешь фильтры (middleware), которые при определенных событиях делают определенные действия (в примере, останавливают выполнение скрипта)
2) Порядок важен, в контексте работы, например есть смысл вначале проверить есть ли авторизация у пользователя, а только потом проверять token у переданной формы. Если нет такого требования, то и порядок не важен, например если редиректить женщин и стариков, в другой раздел, то вполне можно в одном middleware проверять возраст, а в другом пол, при этом порядок не важен.
3) Реализовывать можно по-разному, ориентируясь на свои требования. Чаще всего, middleware это набор объектов которые возвращает true для is_callable и выполняют какие либо действия по анализу переданных в них данных.
Как-то так..