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

0

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

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

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

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

Каков лучший способ достичь этой логики?

Теги:
cakephp
cakephp-model

3 ответа

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
    На самом деле это ближе к тому, что я ищу, я использую cakephp 1.3, но я могу использовать приложение: в любом случае использует эквивалент. Спасибо!
1

Правило большого пальца: если это манипуляция данными, это должно быть сделано в модели.

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

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

  • 0
    Моя общая логика довольно проста, поэтому я хотел бы поделиться ею между моделями и контроллерами, поэтому поведение или контроллер не подходят точно
  • 0
    Я предполагаю, что вы знаете, что вы можете вызвать метод модели из контроллера? Так в чем же проблема?
0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню