Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何组织CakePHP代码?_Php_Cakephp_Transactions - Fatal编程技术网

如何组织CakePHP代码?

如何组织CakePHP代码?,php,cakephp,transactions,Php,Cakephp,Transactions,我从CakePHP开始。我有非常简单的模型: 使用者 公司 CompanyUsers(用户和公司之间有许多相互关联的关系) 我创建了一个用户,当我以这个用户的身份登录时,如果用户和公司之间没有任何关系,我将被重定向到公司控制器的添加操作。这一切都完成了,并且运行良好 我的“大”问题是:当我保存一家公司时,我必须保存该公司的数据以及当前用户与创建的公司之间的关系。这一切都必须在交易中完成,因为我不想要“孤儿”公司。但是我应该把这个代码放在哪里呢?在公司模型中创建save()函数,并在保存后创建

我从CakePHP开始。我有非常简单的模型:

  • 使用者
  • 公司
  • CompanyUsers(用户和公司之间有许多相互关联的关系)
我创建了一个用户,当我以这个用户的身份登录时,如果用户和公司之间没有任何关系,我将被重定向到公司控制器的添加操作。这一切都完成了,并且运行良好

我的“大”问题是:当我保存一家公司时,我必须保存该公司的数据以及当前用户与创建的公司之间的关系。这一切都必须在交易中完成,因为我不想要“孤儿”公司。但是我应该把这个代码放在哪里呢?在公司模型中创建save()函数,并在保存后创建关系?是否在公司模型中创建afterSave()函数?将所有代码放入CompanyController的添加操作中?我认为最后一个选项不是一个好主意,商业逻辑必须在模型中,不是吗


我知道这一定是一个非常基本的问题,但我对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