Представления блейдов и, следовательно, директивы блейдов отображаются в php файлах только один раз после их обновления. В вашем случае состояние аутентификации будет проверяться при самом первом посещении страницы.
Чтобы директива проверяла состояние аутентификации при каждом запросе, необходимо отправить код php обратно в представление в виде строки, так что она может выполняться каждый раз.
Вы можете узнать, как выглядит визуализированный вид, проверив папку storage/framework/views
. Он содержит все скомпилированные представления.
В вашем случае вам придется вернуть что-то подобное из вашей директивы:
return '<?php if (auth()->user() && auth()->user()->role_id == 3): ?>';