Article и Author - точно сущности уровня домена, почему правила вдруг нет?
Тут ключевое, пожалуй, bounded context. Я не был бы уверен, что у него реально там есть Author как сущность в том же BC, что и Article. Т.е. Article::$authorId тут может просто быть просто как сквозное значение, которое самому домену особо и не нужно, в реальности там обычный $userId, общий для всего сайта. Правила бывают разные, некоторые из них не хочется тащить в тот же BC. Если завтра у него размещение статей станет платным, а для яблочников (Safari) цены будут в 2 раза выше, а для каких-то партнёров размещение останется бесплатным, то скорее всего всё будет грустно, если всё тащить в один контекст.
Т.е. правила по-хорошему, конечно, domain, но вопрос какой именно
А связывать эти BC можно по-разному: через UI, через декорирование (command bus, например), Saga, etc.
Хотя, возможно, я бы тоже сделал сначала по-простому, с двумя разными методами Article::editByUser(LimitPolicy) и Article::editByModerator().
CQRS хотел упомянуть, да, в том контексте, что command handler'ы можно декорировать, например, используя аннотации к методу handle, указывая там необходимые роли и прочую фигню. А для обычных application services нужен AOP. А поскольку никакого AOP у вас нет,
@Redjik пытается внедрить ограничения на уровне REST API. Но ограничивать на уровне команд гораздо комфортнее на мой взгляд, т.к. они отражают реальное бизнес-действие, мы понимаем, что ограничили команду EditArticleCommand, а не «POST /article/42» (причем этот «POST /article/42» может маппится на разные команды...). Да и внешний API не вечен.
Касаемо RC, это непростой вопрос.
Если можно забить, то я забиваю. Что случится, если пользователь отредактирует статью лишний раз, используя параллельные запросы? Если мотивация была в том, чтобы ограничить искусственный «ап» статьи в рейтинге последних редактируемых, то вообще похер.
Если правила находятся внутри самого aggregate root (в смысле, все значения хранятся вместе с ним), то проблемы нет, т.к. aggregate root сохраняется атомарно и являются по сути инвариантами этого AR.
Если правила вне его, то по-хорошему — saga.
Если по-простому — mutex. Опять-таки, можно навесить декоратором на command handler.
Но это всё IMHO.