Примечание: я узнал этот открытый вопрос Как правильно разделить логику приложения в CakePHP? что очень похоже, но так как вопросы открыты и мертвы с 2010 года, я думаю, что лучше создать новый.
У меня есть некоторые общие функции, которые я хотел бы использовать, не повторяя их в нескольких частях моего приложения Cakephp, конкретно в Model и Controller. Эти функции довольно просты, например, повторная обработка строки для удаления странных символов, поэтому я могу применять их в разных точках и не хочу получать несколько копий из одного и того же кода.
Первым делом я подумал о том, чтобы использовать Компонент, но не рекомендуется использовать их в Моделях, я также вижу, что возможно использовать плагин, но я думаю, что он слишком большой, чтобы его поддерживать.
Может быть, я мог бы просто поместить эти функции в файл начальной загрузки, но мне не очень нравится это решение.
Какой лучший способ добиться этого логического разделения?
Как сказали Дейв и Бурзум, если это связано с данными, поместите их в модель / поведение.
Но если он более общий, вы можете просто поместить его во внешнюю библиотеку и затем использовать эту библиотеку.
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();
}
}
Основное правило: если это манипулирование данными, это должно быть сделано в модели.
Если вы хотите разделить логику между моделями: сделайте это поведением.
Таким образом, вы можете прикрепить его к моделям, которые нуждаются в функциональности. В Cake3 вы также можете использовать черты.
Могли бы положить их в вашу AppModel. Таким образом, вы можете получить к ним доступ из любой модели (что означает, что вы также можете получить доступ из любого контроллера).
Если вы поместите его в AppModel, он просто будет автоматически доступен для всех моделей.
И вы можете получить к ним доступ через любой контроллер, запустив его через загруженную модель:
// in any Model
$this->whateverMethod();
// in any Controller
$this->MyModel->whateverMethod();