2016-08-14 3 views
2

Я пишу приложение для расписания, которое будет использоваться сотрудниками и одобрено/отклонено супервизорами. Расписание имеет разные разрешения, и только определенные лица могут выполнять определенные действия (например, только супервизор может утверждать расписание и только в том случае, если он принадлежит сотруднику в списке сотрудников супервизора).PHP - шаблон дизайна дизайна Hellp

Я пытаюсь выяснить, как структурировать список бизнес-объектов (моделей). Существуют различные проверки, которые мне нужно выполнить, прежде чем я могу ссылаться на такие методы, как GetTimesheet или SaveTimesheet или ApproveTimesheet. Смотрите следующий псевдо-код для понимания того, как мое приложение должно работать:

GetTimesheetByUserIdAndMonth: 

    -Validate parameters like UserId, Month-Year value 

    -Check Permissions: 
    - If Logged In User is A Supervisor, then see if Timesheet belongs to either this user or to a user under Supervisor's list of Employees 
    - Else, check if Timesheet belongs to logged in User 


SaveTimesheet 

    -Validate parameters like UserId, Month-Year value 

    -Check Permissions (same as above) 

    -Check if user has write ability for timesheet (for example if user had already submitted timesheet before then he can't re-save or re-submit) 

SubmitTimesheet 

    -See if user has a supervisor assigned 

ApproveTimesheet, RejectTimesheet 

    -Logged in User must be a Supervisor, otherwise throw an error 

Я думаю, я должен был бы класс MyAccount для человека, вошедшего в, класс пользователя, чтобы представить человека, который в расписание относится к классу Timesheet и, возможно, некоторому классу Validation.

Может ли кто-нибудь сказать мне, как лучше всего построить этот код и какие классы и методы проверки должны иметь? У меня уже есть этот код, работающий в 100% процедурный код ... его очень трудно читать и поддерживать. Я не ищу полную информацию о реализации, просто общую архитектуру/структуру класса. Пожалуйста, дайте мне несколько идей и предоставьте мне несколько psuedo-code, как выполнить вышеуказанные задачи. При необходимости я могу предоставить более подробную информацию.

Заранее спасибо.

ответ

0

В вашем вопросе я могу понять 3 различных типа проблем для решения.

  1. Иерархическая структура
  2. Права доступа
  3. Валидация

Возможный шаблон для решения этой проблемы является Composite моделью. Ниже приведены некоторые общие рекомендации, которые следует соблюдать.

  • Используйте абстракцию, которая может использоваться для связи со всеми видами пользователей (супервизоры, сверстники и т. Д.). Что-то вроде «Пользователь».
  • Использование композитных для поддержания иерархии.
  • Абстракция 'Пользователь' должен иметь методы, такие как getWritePermission: boolean для предоставления разрешений.
  • Валидации должны быть отделены от основной структуры. Вы должны поддерживать эту логику, используя отдельный рабочий класс, который будет вызываться на самом высоком уровне вызова api.
0

Я полагаю, вы используете подход mvc. Если так, вы уже на правильном пути. Для каждого действия пользователя требуется контроллер. То, что вы уже записали, соответствует этой схеме. Трудная часть заключается в том, как вы храните пользователя: отношение супервизора? И это 1: n или m: n? Во всяком случае, я бы пошел с моделью пользователя и расписания (при поддержке базы данных), а затем по мере необходимости. Вам не нужно различать пользователя и других пользователей на уровне объектов класса. Внутри ты - собственный судья. Кажется, необходим класс валидатора расписания и класс для проверки прав пользователя (дополнительно к системе входа в систему). Подумайте следующее UploadTimesheetController -> TimesheetValidatorClass -> TimesheetModel -> База данных ViewTimesheetController -> CheckUserHasAccess -> TimesheetModel -> TimesheetView Это немного упрощенным и формально не правильно, но я надеюсь, что вы получите эту идею.

Смежные вопросы