Проведения (Behavior) нужны для того, чтобы использовать повторяющийся фрагмент кода в разных местах не копирую его каждый раз. Например, сохранение фотографий может быт нужно для аватарки и для обложки статьи.
События нужны для того, чтобы можно было в разных местах кода на него реагировать. Например, если у нас новый лайк у пользователя, мы под это дело добавляем ему рейтинг, а в другом месте можем проверять, что рейтинг достиг какого-то уровня и нужно изменить подпись, в третьем месте мы отправляем ему письмо с поздравлением о новом рейтинге. События позволяют все это делать не сильно зависимым друг от друга.
Компоненты - это обычно какие-то штуки, которые нужно в разных частях приложения, и часто в единичном экземпляре, например, модель мы хотим засунуть как можно в более узкое место, поэтому она не компонент (хотя, по-моему от него тоже наследуется, но не уверен)... Я что-то сходу даже не придумал, для чего в Вашем случае может быть нужен свой компонент, за исключением инфраструктуры фреймворка, типа Запрос, Ответ, Роутинг, Сессии и т.д.
В итоге:
Контроллер принимает запрос и переправляет его к слою модели, модель что-то делает и контроллер рендерит представление (view) и отправляет результат.
Модель, если особой логики нет, то это может быть сама Active Record, если логики много, создаются сервисы, это тоже слой модели, но так получается понятнее код.