如何组织CakePHP代码?
我从CakePHP开始。我有非常简单的模型:如何组织CakePHP代码?,php,cakephp,transactions,Php,Cakephp,Transactions,我从CakePHP开始。我有非常简单的模型: 使用者 公司 CompanyUsers(用户和公司之间有许多相互关联的关系) 我创建了一个用户,当我以这个用户的身份登录时,如果用户和公司之间没有任何关系,我将被重定向到公司控制器的添加操作。这一切都完成了,并且运行良好 我的“大”问题是:当我保存一家公司时,我必须保存该公司的数据以及当前用户与创建的公司之间的关系。这一切都必须在交易中完成,因为我不想要“孤儿”公司。但是我应该把这个代码放在哪里呢?在公司模型中创建save()函数,并在保存后创建
- 使用者
- 公司
- CompanyUsers(用户和公司之间有许多相互关联的关系)
我知道这一定是一个非常基本的问题,但我对CakePHP和MVC都是新手。您的第一个问题的答案是,您不需要在模型中插入额外的代码,这可以在类似这样的控制器中完成 CompanyController.php
$datasource = $this->Company->getDataSource();
try{
$datasource->begin();
if(!$this->Company->save($data)
throw new Exception();
if(!$this->User->save($data_one)
throw new Exception();
$datasource->commit();
} catch(Exception $e) {
$datasource->rollback();
}
第二个问题的答案有点难。我个人觉得Cakephp充满了糟糕的实践。它应该遵循胖型和瘦型控制器的概念。如果您想编码MVC的最佳实践,那么模型层将包含所有业务逻辑,而不是蛋糕基本功能。您的第一个问题的答案是,您不需要向模型中插入额外的代码,这可以在类似这样的控制器中完成 CompanyController.php
$datasource = $this->Company->getDataSource();
try{
$datasource->begin();
if(!$this->Company->save($data)
throw new Exception();
if(!$this->User->save($data_one)
throw new Exception();
$datasource->commit();
} catch(Exception $e) {
$datasource->rollback();
}
第二个问题的答案有点难。我个人觉得Cakephp充满了糟糕的实践。它应该遵循胖型和瘦型控制器的概念。如果您想编码MVC的最佳实践,那么模型层将包含所有业务逻辑,而不是基本功能
这一切都必须在交易中完成,因为我不想要“孤儿”公司
使用saveAssociated
CakePHP已经提供了一个函数,它可以完全满足您的要求:(也可以通过访问)
模型::saveAssociated(数组$data=null,数组$options=array())
选项数组具有多个最相关的键:
原子:如果为true(默认),将尝试在单个事务中保存所有记录。如果数据库/表不支持事务,则应将设置为false
因此,不需要任何额外的代码,只需调用saveAssociated
,此时正在调用save
用法
确保保存的数据是a的正确格式-如果有疑问,应与包含相同数据的查找的格式相同:
class ExampleController extends AppController {
function example() {
$data = array(
'Company' => array(
'name' => 'My Company'
),
'CompaniesUser' => array(
'user_id' => 'My User Id'
)
);
$this->Company->saveAssociated($data);
}
}
这将保存新公司和与给定用户的关系,或者无法修改数据库中的任何内容
这一切都必须在交易中完成,因为我不想要“孤儿”公司
使用saveAssociated
CakePHP已经提供了一个函数,它可以完全满足您的要求:(也可以通过访问)
模型::saveAssociated(数组$data=null,数组$options=array())
选项数组具有多个最相关的键:
原子:如果为true(默认),将尝试在单个事务中保存所有记录。如果数据库/表不支持事务,则应将设置为false
因此,不需要任何额外的代码,只需调用saveAssociated
,此时正在调用save
用法
确保保存的数据是a的正确格式-如果有疑问,应与包含相同数据的查找的格式相同:
class ExampleController extends AppController {
function example() {
$data = array(
'Company' => array(
'name' => 'My Company'
),
'CompaniesUser' => array(
'user_id' => 'My User Id'
)
);
$this->Company->saveAssociated($data);
}
}
这将保存新公司和与给定用户的关系,或者无法修改数据库中的任何内容。我对CakePHP非常陌生,我刚刚开始使用此应用程序。你说过CakePHP充满了坏习惯。那么,您向我推荐哪种框架(PHP或其他语言)(请记住,我想构建一个具有大量模型和业务逻辑的应用程序)?如果您是PHP新手,那么选择哪种框架进行开发并不重要。对于初学者来说,其他PHP框架可能并不容易。不,我不是CakePHP新手,也不是软件开发新手(超过10年的经验)。我是MVC web应用程序和CakePHP的新手(我已经尝试过RoR和Grails,但我发现CakePHP更易于开发和部署)是的,编写和制作应用程序非常容易。你可以试着想想这个答案,我认为这个逻辑必须在模型内部。。。你有没有关于如何实现这一点的例子?我对CakePHP非常陌生,我刚刚开始使用这个应用程序。你说过CakePHP充满了坏习惯。那么,您向我推荐哪种框架(PHP或其他语言)(请记住,我想构建一个具有大量模型和业务逻辑的应用程序)?如果您是PHP新手,那么选择哪种框架进行开发并不重要。对于初学者来说,其他PHP框架可能并不容易。不,我不是CakePHP新手,也不是软件开发新手(超过10年的经验)。我是MVC web应用程序和CakePHP的新手(我已经尝试过RoR和Grails,但我发现CakePHP更易于开发和部署)是的,编写和制作应用程序非常容易。你可以试着想想这个答案,我认为这个逻辑必须在模型内部。。。你有没有关于如何做到这一点的例子?太好了!因此,我必须为公司创建一个表单,包含保存公司的所有数据。然后,在控制器中,我分配当前用户id和其他相关数据(如CompanyUsers角色),并调用Company->saveAssociated($this->request->data),不是吗?@marccasas简言之:yes=)太好了!所以我必须为公司创建一个表单,wi