相关疑难解决方法(0)

CakePHP - 放置服务逻辑的位置

我是Java程序员,试图调查CakePHP - 目前我的应用程序结构/设计有问题.我无法理解在哪里放置应用程序的核心逻辑.

当我在JavaEE中开发时,常见的方法如下所示:

  • 模型类是表示数据实体(产品,人员等)的简单bean - 大多数类似于具有getter/setter的数据结构;

  • 控制器类是足够简单的类,它们聚合必要的数据并将它们注入专用的View模板,然后发送给用户;

  • DAO(DataAccessObject)或Repository类是可以将实体加载和存储到数据库中的类;

  • 服务类通常是包含某些业务逻辑方法的单例 - 这些方法由控制器,其他服务或调度操作调用,另一方面,它们自己调用DAO/Repository方法来获取或修改数据.

例如,如果我有实体Person,Product并且Order,当用户选择某个产品并点击"将它放入我的购物车/购物篮"时new Order,Person应该创建这个并且Product应该添加到此Order(我们可以检查这Person是不是坏的债务人,Product并且存在在商店等) - 所有这些工作都是在OrderService一些控制器调用的方法中执行的.

通常使用某种IOC(控制反转),以便所有服务和控制器都有必要服务的链接等.

现在,我对CakePHP中如何完成这一切感到有些困惑.我应该把这个业务逻辑等放在哪里?

architecture cakephp

13
推荐指数
1
解决办法
2783
查看次数

如何使用CodeIgniter测试控制器?

我有一个使用CodeIgniter MVC框架构建的PHP Web应用程序.我想测试各种控制器类.我正在使用Toast进行单元测试.我的控制器没有状态,它们处理的所有内容都保存到会话中或传递给视图显示.创建一个模拟会话对象并测试它是否正常工作很简单(只需创建一个模拟对象并使用$ controller-> session = $ mock注入它).

我不知道的是,如何使用视图.在CodeIgniter中,视图加载为:

$this->load->view($view_name, $vars, $return);
Run Code Online (Sandbox Code Playgroud)

由于我不想改变CI代码,我虽然可以创建一个模拟Loader并替换原始代码.这就是问题所在,我找不到从CI_Loader派生新类的方法.

如果我不包含system/libraries/Loader.php文件,那么类CI_Loader是未定义的,我不能继承它:

class Loader_mock extends CI_Loader
Run Code Online (Sandbox Code Playgroud)

如果我确实包含该文件(使用require_once),我会收到错误:

Cannot redeclare class CI_Loader
Run Code Online (Sandbox Code Playgroud)

看起来CI代码本身不会出于任何原因使用require_once.

这里有没有人有单元测试CodeIgniter驱动的应用程序的经验?

编辑:我试图在运行时将一个真正的加载器对象注入一个模拟类,并使用__call,__ set,__ get,__ isset和__unset重定向所有调用和变量.但是,它似乎不起作用(我没有得到任何错误,只是没有输出,即来自Toast的空白页).这是代码:

class Loader_mock 
{
    public $real_loader;
    public $varijable = array();

    public function Loader_mock($real)
    {
        $this->real_loader = $real;
    }

    public function __call($name, $arguments) 
    {
        return $this->real_loader->$name($arguments);
    }

    public function __set($name, $value)
    {
        return $this->real_loader->$name = $value;
    }

    public function __isset($name)
    {
        return isset($this->real_loader->$name);
    }

    public function __unset($name)
    {
        unset($this->loader->$name);
    } …
Run Code Online (Sandbox Code Playgroud)

php codeigniter

12
推荐指数
1
解决办法
1万
查看次数

PHP域模型,DAO以及如何实现

当我昨天问一个关于单数/复数模型命名约定的问题时,我遇到了域模型的概念.据我所知,到目前为止,域模型只是一个对象,它代表了我的应用程序中的一个实体.

要使用一个非常简单的示例,请执行以下操作:

class User {

    private $name;

    public setName() {}
    public getName() {}

}
Run Code Online (Sandbox Code Playgroud)

现在,我想到了这个问题,我如何从一些输入源,从数据库或数据源填充这个"域模型"?

在阅读关于域模型的过程中,我得到的印象是,在它们内部应该只有一个表示域概念的表示.所以现在我还需要另一个负责与数据源交互的类(DAO?),在这种情况下是一个名为"User"的数据库表.我的DAO类将处理插入,更新,删除和多次提取.

我想出了这种方法从输入填充用户域模型,在这种情况下发布数据,然后使用UserDAO类将记录保存到数据库:

/**
 * Populating Domain Model from input, and saving to database
 */

/** Instantiate User Domain Model, and populate it from input */
$user = new User();
$user->setName($_POST['name']);

/** Creating a new database record from User Domain Model */
$userdao = new UserDAO($pdo);
$userdao->insert($user);
Run Code Online (Sandbox Code Playgroud)

这是我在需要获取数据时预期与数据库交互的方式,在这种情况下是多个用户记录:

/**
 * Fetching data from database to populate User Domain Models in an array
 */

/** Instantiate new …
Run Code Online (Sandbox Code Playgroud)

php dao model

12
推荐指数
1
解决办法
4244
查看次数

重定向到子域的规则

谁定义了要重定向到移动版本的URL?

让我们以twitter为例:

  • https://twitter.com - >重定向移动
  • https://dev.twitter.com - >不重定向移动

在一个负责规则重定向的MVC应用程序中?
可能全部www都有重定向到移动设备?

php subdomain model-view-controller url-routing

11
推荐指数
1
解决办法
2082
查看次数

模型类是应该表示实体还是返回实体

我正在使用CodeIgniter设计一个Web应用程序(但我认为这个问题通常适用于Web应用程序中的MVC模式).

当我为某个数据库实体设计模型类时(例如,BlogEntry为了说明),我基本上有两个选择:

"经典OOP"方法是让类代表实体,即类的一个实例 BlogEntry.在CodeIgniter中,这将导致类似的代码

class Blogentry extends CI_Model {
    function load($id) {
      // Access database
      $this->id = $dbresult.id;
      $this->title = $dbresult.title;
      $this->author = $dbresult.author;
    }
}
Run Code Online (Sandbox Code Playgroud)

要访问某些博客条目,我会进行$this->load->model('blogentry');调用$this->blogentry->load($id),然后使用模型类实例.

我经常在野外看到的另一种方法是让模型在某些数据结构中返回实体.在代码中:

class Blogentry extends CI_Model {
  function get_entry($id) {
    // Access database, yielding $dbresult
    return $dbresult;
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我会写

$this->load->model('blogentry');
$the_entry = $this->blogentry->get_entry($id);
Run Code Online (Sandbox Code Playgroud)

在控制器中工作$the_entry.在第二种情况下,类更像是工厂构建器类.

这两种方法中的任何一种都被认为是在MVC中做M的"正确方法"吗?我想,我经常看到第二种方法,但我没有看过那么多MVC-Webapps.对于为什么第一种或第二种方法可能更合适的任何想法?

php model-view-controller codeigniter

10
推荐指数
1
解决办法
2419
查看次数

OOP中的单一责任原则

在我的应用程序设计中,我通常将对象映射到数据库中的重要表.然后,对象处理与该数据相关的所有内容(包括链接表).因此,我例如已经建立了一个Activity对象,具有类似性质namedue_date,方法等load()save(),并且还方法等getParent(),getContributors()并且getTeam(),其返回(阵列)的其他对象.这是"坏"OOP,因为它违反了单一责任原则吗?

php oop single-responsibility-principle

9
推荐指数
1
解决办法
2157
查看次数

PHP - 从Model加载Database对象的最佳方法,但只有一个实例?

这是我的问题,我有一个很小的PHP MVC框架我建立.现在,当我在控制器中,我应该能够加载一个模型.我的模型名称像Users.php,Pages.php等数据库表.

所有控制器都扩展了BaseController,并且所有模型都扩展了BaseModel,这样我可以为所有控制器提供一些方法.像任何控制器一样,我可以像这样使用loadModel方法:

$usersModel = $this->loadModel("Users");
Run Code Online (Sandbox Code Playgroud)

现在$ usersModel将是表示用户数据库表的对象,从那里我应该打开数据库连接,并从users表中获取,更新,删除东西.

要从我的模型获取数据库连接,baseModel有方法loadDatabase(),我使用它像这样:

$database = $this->loadDatabase();
Run Code Online (Sandbox Code Playgroud)

这将返回PDO周围的薄层,所以从那里我可以使用这样的东西:

$data = $database->fetchAssoc("SELECT * FROM users WHERE name = ?", array("someone"));
Run Code Online (Sandbox Code Playgroud)

这就是我将一些$ data从Model返回给Controller的方法.

所以基本上,Controller可以加载模型,然后在该模型上调用返回某些数据或更新或删除等的方法.

现在,Controller可以加载多个模型.每个模型都应该加载数据库,这就是它变得复杂的地方.我只需要一个数据库连接.

这是loadDatabase方法的外观:

    public function loadDatabase()
    {
        // Get database configuration  
        require_once("Application/Config/Database.php");

        // Build configuration the way Database Object expects it
        $dns      = "{$db_config['db_driver']}:host={$db_config['db_host']};dbname={$db_config['db_name']}";
        $username = $db_config['db_user'];
        $password = $db_config['db_pass'];
        $options  = $db_config['db_options'];

        // Return new Database object
        return new \Core\Database\Database($dns, $username, $password, $options);

    }
Run Code Online (Sandbox Code Playgroud)

因此,在加载Database对象之前,我必须加载数据库连接的配置,因为Database对象__constructor需要它.然后我实例化新的数据库对象并返回它.

现在我卡住了,我不知道这是从模型加载数据库的正确方法吗?我应该如何设置它,如何从模型内部加载数据库,因此始终只有一个数据库对象实例.如果我从Controller那样做这样的事情,那就更好了:

$users = $this->loadModel("Users");
$pages = $this->loadModel("Pages");

$users->doSomethingThatNeedsDatabase(); …
Run Code Online (Sandbox Code Playgroud)

php database model-view-controller

8
推荐指数
1
解决办法
9430
查看次数

如何在MVC 2D游戏中处理对象的图形表示?

我正在使用MVC模式在java中制作2D游戏,在阅读并搜索我的屁股之后,我仍然没有找到令人满意的安装,我应该如何处理对象的图形表示.

我应该将每个对象,例如Player分为PlayerModel(存储在Model中)和PlayerView(存储在View中)吗?

那似乎有点混乱,因为我必须跟踪哪个grapical-representation-object,即"ScaryMonsterEnemyView"连接到哪个逻辑表示对象,"ScaryMonsterEnemyModel".根据MVC,这真的是我应该怎么做的吗?如果是这样,这个连接应该存储在哪里?在视图中?

我知道这可能是一个愚蠢的问题,但我想从一开始就尽可能多地获得.谢谢你的帮忙:)

java model-view-controller

8
推荐指数
1
解决办法
895
查看次数

基本的MVC(PHP)结构

我有一个简单登录表单的以下数据流.

用户访问控制器PHP文件.控制器包括model.php和view.php

用户提交表单,控制器将POST数据发送到模型方法,并返回结果.

用户登录,并由控制器转发到不同的视图(登录成功消息).

目前我的观点是静态HTML(没有PHP),所以这是我的问题.然后向用户传递欢迎信息的正确方法是什么,例如"Hello,Craig!"?

视图是否允许PHP片段,例如

<?php echo $username; ?> 
Run Code Online (Sandbox Code Playgroud)

既然模型在控制器文件中加载之前呢?

谢谢!

编辑:更好的做法是允许视图访问特定的类方法,例如

<?php $user->getUsername(); ?>
Run Code Online (Sandbox Code Playgroud)

而不仅仅是变量?


基于其他答案,我发现了一篇非常有用的文章,您可能也会感兴趣.

http://www.nathandavison.com/posts/view/7/custom-php-mvc-tutorial-part-5-views

php model-view-controller

8
推荐指数
2
解决办法
2万
查看次数

MVC - 从模型重定向是错误的

我想问一下,从模型而不是控制器重定向是否是一种好方法.

我想这样做的原因是因为从模型中单元测试重定向更容易(我只是将模拟重定向器对象传递给我的测试中的模型),而不是单元测试更难控制的控制器.它还使控制器更薄,因为我在控制器中所做的只是创建模型的实例并从请求对象传递它的参数.控制器中没有这样的if/else.

这是一种不好的做法吗?

oop model-view-controller design-patterns

8
推荐指数
1
解决办法
1369
查看次数