2011-01-27 5 views
0

Я развиваю группу-подобную систему, и я пришел в этот проект, когда система уже построена на 70%, и она была построена с использованием cakePHP, если честно, я ничего не знаю о 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 метод), спасибо большое

+0

Из любопытства вы задали этот чрезвычайно конкретный вопрос CakePHP в списке рассылки CakePHP, чат-канале или дискуссионном форуме? –

+0

i did not, когда я столкнулся с этой проблемой, первое, что появилось в моем сознании, - это stackoverflow, извините, я думаю. я пойду и спрошу об этом там. – littlechad

ответ

2

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

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

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

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

Update

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

/app/bootstrap.php

  • это когда у вас есть общие коды среди везде в вашем приложении, как debug, json_encode (когда версия PHP < 5.2) и т.д.

/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/*/

  • И никогда не ставить свой код под вебсервера! Это не опрятно, сломайте структуру Cake, и это не рекомендуется! Это зло. Учитывая, что вы вытеснили свой код из Cake, если они не могут вписаться в Cake.

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

2

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

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

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

Таким образом, вы можете поместить метод 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 выше, потому что вы, вероятно, чтобы найти ответы на большинство ваших вопросов там ...

PS Престижность для модульного подхода. Это всегда освежает, чтобы увидеть ...

+0

спасибо за то, что указали мне в правильном направлении, мне бы хотелось провести больше времени, изучая рамки, прежде чем когда-либо прыгать в систему и делать некоторые беспорядки кодам, проблема в том, что у меня плотный график, мой босс не позволит меня, Дарн! Я сам ненавижу работать так. – littlechad

+0

Спасибо @mtnorthrop за поддержку! Да, в CakePHP есть много ярлыков при выполнении определенных задач, но старайтесь не испытывать соблазна сделать это, потому что вы можете испортить красоту пирога. Я обновил свой ответ выше с некоторым примером размещения кода. Ура! –

Смежные вопросы