Примечание. Я выяснил этот открытый вопрос. Какое правильное место для обмена логикой приложения в 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();