Cakephp: разделить логику между моделью и контроллером

Примечание: я узнал этот открытый вопрос Как правильно разделить логику приложения в CakePHP? что очень похоже, но так как вопросы открыты и мертвы с 2010 года, я думаю, что лучше создать новый.

У меня есть некоторые общие функции, которые я хотел бы использовать, не повторяя их в нескольких частях моего приложения Cakephp, конкретно в Model и Controller. Эти функции довольно просты, например, повторная обработка строки для удаления странных символов, поэтому я могу применять их в разных точках и не хочу получать несколько копий из одного и того же кода.

Первым делом я подумал о том, чтобы использовать Компонент, но не рекомендуется использовать их в Моделях, я также вижу, что возможно использовать плагин, но я думаю, что он слишком большой, чтобы его поддерживать.

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

Какой лучший способ добиться этого логического разделения?

0

Решение

Как сказали Дейв и Бурзум, если это связано с данными, поместите их в модель / поведение.

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

Lib/MyLib.php
<?php

class MyLib {
public static function doThis() {}
}

app/Controller/FooController.php
<?php
App::uses('AppController', 'Controller');
App::uses('MyLib', 'Lib');

class FooController extends AppController {
public function someAction () {
MyLib::doThis();
}
}

app/Model/Foo.php
<?php
App::uses('AppModel', 'Model');
App::uses('MyLib', 'Lib');

class Foo extends AppModel {
public function someMethod () {
MyLib::doThis();
}
}
0

Другие решения

Основное правило: если это манипулирование данными, это должно быть сделано в модели.

Если вы хотите разделить логику между моделями: сделайте это поведением.

Таким образом, вы можете прикрепить его к моделям, которые нуждаются в функциональности. В Cake3 вы также можете использовать черты.

1

Могли бы положить их в вашу AppModel. Таким образом, вы можете получить к ним доступ из любой модели (что означает, что вы также можете получить доступ из любого контроллера).

Если вы поместите его в AppModel, он просто будет автоматически доступен для всех моделей.

И вы можете получить к ним доступ через любой контроллер, запустив его через загруженную модель:

// in any Model
$this->whateverMethod();

// in any Controller
$this->MyModel->whateverMethod();
0