Это частая путаница для новых пользователей Seaside. Мы очень старались сделать это более понятным в Seaside 2.9, которая в настоящее время находится в альфа-версии, но здесь я постараюсь сосредоточиться на версии 2.8, так как похоже, что вы ее используете.
Прежде всего, вы правы в том, что вам не нужно использовать компонент для доступа к сеансу. Seaside 2.9 перемещает #session
в новый класс WAObject
, что делает его доступным почти для всех объектов Seaside (включая компоненты), но вы определенно можете ссылаться на WACurrentSession
сейчас в версии 2.8.
Компоненты обеспечивают примерно следующую функциональность в 2.8:
#renderContentOn:
вызывается с экземпляром любого класса рендерера, который вы указали в #rendererClass
(вместо того, какой рендерер используется, когда ваш объект запрашивается для рендеринга)
- Хук (
#updateUrl:
), позволяющий обновлять URL-адрес, используемый визуализатором для создания ссылок.
- Хуки (
#updateRoot:
, #style
, #script
), позволяющие обновлять раздел HEAD HTML-документа
- Возможность быть корнем приложения
- Хуки (
#updateStates:
, #states
) для упрощения возврата к состоянию
- Хук (
#initialRequest:
) для разрешения инициализации на основе запроса, вызвавшего создание сеанса.
- Средство (
#children
), чтобы убедиться, что все компоненты ниже вас также будут иметь вызовы вышеперечисленных хуков.
- Возможность добавления украшений
- Возможность показать/ответить/позвонить (использует украшения)
- Некоторые удобные методы (
#inform:
, #isolate:
и т. д.)
Если вам не нужно ничего из вышеперечисленного, вам не нужен компонент. Если вам нужно что-то из вышеперечисленного, вам в значительной степени нужен компонент, если только вы не хотите реализовать эквивалентную функциональность в своем собственном классе.
Простейшая метрика, вероятно, такова: если вы собираетесь хранить объект между HTTP-запросами, он должен быть компонентом; если вы собираетесь выбрасывать объект и создавать его при каждом проходе рендеринга, вероятно, в этом нет необходимости. Если вы представляете приложение, отображающее страницы блога, у вас, вероятно, будут компоненты для меню, прокрутки блога, тела блога, каждого комментария и так далее. Возможно, вы захотите исключить чтение разметки блога и генерацию его HTML, чтобы вы могли поддерживать разные разметки или разные средства визуализации, а также чтобы компоненты комментариев могли поддерживать одну и ту же разметку. Это можно сделать с помощью класса, не являющегося компонентом, который реализует #renderOn:
и может быть создан и использован другими компонентами по мере необходимости.
Seaside 2.9 в настоящее время разделяет вышеупомянутую функциональность, делая WAPresenter
конкретным и вводя WAPainter
в качестве его суперкласса. 1-3 выше реализованы на WAPainter
, а 4-7 на WAPresenter
, поэтому у вас есть выбор, какой подкласс следует использовать в зависимости от ваших потребностей. Он также удаляет множество методов из WAPresenter и WAComponent, чтобы облегчить их понимание конечными пользователями.
Надеюсь, это поможет.
08.05.2009