новичок на cakePHP: модульный подход - PullRequest
0 голосов
/ 27 января 2011

Я занимаюсь разработкой системы, подобной groupon, и я вошел в этот проект, когда система уже построена примерно на 70% и была построена с использованием cakePHP, если честно, я ничего не знаю о cakePHP. и я наткнулся на это:

участник купил сделку

if(has_enough_account_balance){
    if((parameters validated)){
        insert into 'deal_user' table 
        log transaction
        update 'deal' table by:
            user_count = current user_count + bought deal //to determine whether this deal is tipped or not
        if(this deal is tipped){
            issue coupon
        }
    }
}else{
    this_user_owed
}

Администратор подтвердил, что конкретный пользователь оплатил свою задолженность по сделке

confirm has_paid
update into 'deal_user' table 
log transaction
update 'deal' table by:
    user_count = current user_count + bought deal //to determine whether this deal is tipped or not
if(this deal is tipped){
    issue coupon
}

Теперь, видя, что у этих двоих есть что-то общее, я пытаюсь сделать это:

участник купил сделку

if(has_enough_account_balance){
    if((parameters validated)){
        process_deal(parameters)
    }
}else{
    this_user_owed
}

при подтверждении администратора:

confirm has_paid
process_deal(parameters)

и process_deal будет:

function process_deal(parameters){
    if(isset(deal_id)){
        update into 'deal_user' table 
    }else{
        insert into 'deal_user' table
    }
    log transaction
    update 'deal' table by:
        user_count = current user_count + bought deal //to determine whether this deal is tipped or not
    if(this deal is tipped){
        issue coupon
    }
}

возможно ли делать такие вещи? и где лучше всего поместить этот метод process_deal, я пытался поместить его в класс app_controller, но кажется, что он не будет обновлять таблицу, я не уверен, почему он не может обновить (я использую updateAll метод), большое спасибо

Ответы [ 2 ]

2 голосов
/ 27 января 2011

Я бы пошел с ответом Лайонела Чана выше.

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

Любой код, который имеет дело с таблицей базы данных определенной модели, должен входить в этот конкретный класс модели (жирные модели, на которые ссылается Лайонел).

Таким образом, вы можете поместить метод process_deal в модель Deal.

DealsController может затем получить доступ к методу следующим образом:

$this->Deal->process_deal().

Затем, если есть связь между двумя моделями, например: DealUser hasMany Deal, вы можете получить доступ к методу из действия в DealUsersController следующим образом:

$this->DealUser->Deal->process_deal();

Если между моделями нет взаимосвязи, вы все равно можете вызвать метод process_deal() из действия в DealUsersController, например:

$this->loadModel('Deal');
$this->Deal->process_deal();

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

P.S. Слава за переход на модульный подход. Всегда приятно видеть ...

2 голосов
/ 27 января 2011

Похоже, вы можете реализовать эту функцию в /models/deal_user.php или /models/deal.php как классы моделей, чтобы вы могли разделить process_deal между нужными контроллерами.

Когда контроллер нужен, просто включите ModelClass. Более толстые модели.

и, кроме того, вам не следует включать эту функцию в app_controller, так как может не иметь смысла разделять этот метод со всеми другими контроллерами или создавать модели DealUser и Deal для всех контроллеров, а некоторые могут не нужно вообще.

Если вы попытались debug($this) внутри контроллера, вы знаете, насколько ужасен массив. Чем больше Model вы включите, тем сложнее будет.

Обновление

(основываясь на личном опыте), добавьте ваш код в следующие файлы, когда ..

/app/bootstrap.php

  • Это когда у вас есть общие коды для всех приложений, например debug, json_encode (когда версия PHP <5.2) и т. Д. </li>

/app/controllers/components/*.php

  • Это когда у вас есть общий код / ​​логика между контроллерами, с минимальным взаимодействием с БД.

/app/models/*.php

  • (Толстые модели) Это когда у вас есть общие функциональные возможности между несколькими контроллерами, которые манипулируют данными перед сохранением в БД, например, такой как ваш вопрос выше.

/app/libs/*.php

  • Это когда вы делитесь внешними кодами, которые не вписываются в MVC, например TwitterOauth, или другими общими классами / пакетами, что не имеет смысла преобразовывать его в Компоненты, или слишком сложно для этого. Импортируйте их в торт, используя App::import('Lib', <name>), достаточно и аккуратно.

/app/views/helpers/*.php

  • Когда у вас есть общие html-коды для рендеринга, требуется некоторая логика перед преобразованием их из данных в html-коды.

/app/app_controller.php

  • Имеет только , когда вам нужно сделать хак на beforeFilter, beforeRender и т. Д., Которые должны иметь общие функции среди контроллеров. Причина в том, что ваш *_controller расширяет app_controller, и если вы испытываете искушение, а затем добавляете общие components, uses, helpers в app_controller с надеждой иметь их во всех контроллерах, Оказывается, у вас есть тяжелые контроллеры в каждом запросе. Сделайте это привычкой и постарайтесь сделать ваш app_controller как можно более стройным. Напишите больше кодов в каждом контроллере.

/app/app_model.php

  • Та же идея относится к app_controller

/app/plugins/*/

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

/app/webroot/*/

  • И никогда не размещайте свой код в webroot! Это не аккуратно, нарушать структуру Cake, и это не рекомендуется! Это зло Подумайте об удалении вашего кода из Cake, если он не подходит для Cake.

Я думаю, это все? Опять же, они - мой личный опыт, основанный на опыте кодирования. Комментируйте / редактируйте, если считаете, что они не верны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...