Как правильно разделить логику приложения в CakePHP? - PullRequest
6 голосов
/ 17 июня 2010

Полагаю, простым ответом на вопрос будет компонент .

Хотя я согласен, мне странно, что приходится писать компонент для чего-то такого особенного.

Например, допустим, у меня есть таблица пользователей. Когда пользователь создается, он должен формировать цепную реакцию событий, инициируя различные виды данных, связанных с пользователем, по всей базе данных. Я подумал, что было бы лучше избегать прямого манипулирования базой данных с разных контроллеров, а вместо этого аккуратно упаковать все в метод. Однако, поскольку некоторую логику нужно принимать отдельно, я действительно не могу иметь весь пакет в одном методе. Вместо этого я подумал, что было бы логично разбить его на более мелкие части (например, $userModelOrController->createNew() и $candyStorageModelOrController->createNew()), которые взаимодействуют только с соответствующей таблицей базы данных.

Теперь, если на модель наложить логику, она прекрасно работает, пока мне не понадобятся другие модели. Конечно, это возможно, но по сравнению с загрузкой моделей в контроллер это не так просто. Это как разработчик Cake, говорящий мне: «Конечно, возможно, если ты захочешь сделать это таким образом, но я бы так не поступил».

Затем, если логику перенести на контроллер, я смогу действительно легко получить доступ к другим моделям через $this->loadModel(), но это возвращает меня к ранее объясненной ситуации, так как я должен иметь возможность продолжать цепную реакцию до бесконечности. Доступ к другим контроллерам из контроллера возможен, но опять-таки, похоже, нет прямого способа сделать это, поэтому я предполагаю, что я все еще делаю это неправильно.

Используя компонент, эту проблему можно легко решить, поскольку компоненты доступны для каждого контроллера, который я хочу. Но, как я писал в начале, создавать компонент специально для этой задачи неудобно. Мне кажется, что компоненты больше похожи на пакеты с дополнительной функциональностью (например, основные компоненты), а не на то, чтобы разделять логику, специфичную для контроллера.

Так как я новичок во всей этой MVC, я мог совершенно неправильно понять концепцию. Еще раз, я был бы благодарен, если бы кто-то указал мне правильное направление:)

Ответы [ 5 ]

3 голосов
/ 17 июля 2013

Всякий раз, когда я сталкиваюсь с такими сложными сценариями, я смотрю на CakePHP Events System на бесконечное количество часов.

До сих пор мне удавалось избегать этого как-то (в основном из-за недостатка смелости), но я думаю, что это стоит посмотреть, поскольку он, очевидно, предназначен для того, чтобы прыгать "стены" MVC к степень.

Другим возможным решением является поведение конечного автомата *1011**1012*, которое позволяет более аккуратно продвигать логику к модели и строить вокруг нее компонент Controller +. Единственный запасной вариант (IMHO) этого поведения заключается в том, что он не допускает использование нескольких полей state в одной модели.

Более фактическое представление такой проблемы может привести к лучшим решениям, поскольку многие из нас пошли по этому пути, и это может быть ценным примером.

0 голосов
/ 12 июля 2010

Вероятно, лучший способ реализовать это в плагине.Плагины позволяют вам инкапсулировать всю функциональность во всех частях MVC в пакет, который может быть вставлен в любое место вашего кода через помощники, компоненты, поведение плагина.Таким образом,

  • вы можете разместить функциональность там, где это наиболее удобно,
  • логика хранится отдельно от остальной логики вашего приложения и
  • , которую вы можете включить/ отключить эту функцию при необходимости.
0 голосов
/ 18 июня 2010

Это четко указано в поваренной книге : "Компоненты - это пакеты логики, которые совместно используются контроллерами. Если вам захочется копировать и вставлять объекты между контроллерами, вы можете подумать об упаковкефункциональность в компоненте. "

0 голосов
/ 18 июня 2010

Вы можете использовать AppModel, если хотите, чтобы ваши модели разделяли логику. Если вам нужен доступ к различным моделям вашей модели, вы можете использовать App::import() или ClassRegistry::init. Теперь, если вы хотите, чтобы логика была доступна только для некоторых моделей по вашему выбору, вы можете использовать Behavior или создать другую модель приложения, в которой будут наследоваться только выбранные вами модели.

0 голосов
/ 18 июня 2010

Ошибка deifinitley в том, что CakePHP не поддерживает легкий

  • доступ к другой модели из модели
  • доступ к компоненту из модели
  • доступ к любой модели изкомпонент
  • , имеющий функцию, доступную как из контроллеров, так и из представлений (что-то между компонентами и помощниками), или доступ к компоненту из помощника (или наоборот)

Я в основном закончилдобавление функции в суперкласс AppController.

...