我想创建一个后端,检索一些信息并将其映射回对象。
例如: 我在我的模型课中有这个:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Core_Product_Model extends CI_model {
//get the part id from an partnumber
public function getIdFromPartnumber($partnumber){
$this->db->select("id");
$this->db->from('part_list');
$this->db->where('part_number', $partnumber);
$query = $this->db->get();
return $query->result_object();
}
}
我在控制器中处理它:
class Core_Product_Controller extends MX_Controller {
public function getAllCrosslinks(){
$response[] = array();
$response['error'] = false;
$partNumber = 100;
$output = $this->Core_Product_Model->getIdFromPartnumber($partnumber);
if(isset($output[0])){
$response['output'] = $output;
$response['valid'] = true;
}
echo json_encode($response);
}
}
这有效,但不是我想要的。我想把一切都作为一个对象来检索。这不是一个问题,但这样做是一个好的设计吗?
一些Psuedo代码:
类产品:
class Product {
private $productId;
private $stock;
function __construct($productId) {
$this->productId = $productId;
}
function getProductId(){
return $this->productId;
}
function stock(){
}
function setStock(Stock $stock){
$this->stock = $stock;
}
function getStock(){
return $this->stock;
}
}
模特:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Core_Product_Model extends CI_model {
//get the part id from an partnumber
public function getIdFromPartnumber($partnumber){
$this->db->select("*");
$this->db->from('part_list');
$this->db->where('part_number', $partnumber);
$query = $this->db->get();
$result = $query->result_object();
//loop through result and map back to the Product class, save this to a array
//return the array
}
}
这是以这种方式做到这一点的好方法吗?
答案 0 :(得分:1)
您必须在模型中执行此操作 - 因为CI的结果函数可以提供此功能。
我会告诉你一个方便的方法(但你应该知道 - 这只是一个开始)
在您的特定示例中,您可以执行以下操作
class Core_Product_Model extends CI_model {
//get the part id from an partnumber
public function getIdFromPartnumber($partnumber){
$this->db->select("id");
$this->db->from('part_list');
$this->db->where('part_number', $partnumber);
$query = $this->db->get();
return $query->result("Product");
}
}
请注意,由于命名冲突(例如,Product也可能是控制器的名称)以及CI无法使用命名空间,您应该使用后缀命名这些对象(如Product_Object)
接下来要想到的是,使用自动加载器作为钩子,因为你不想在你的模型中使用“require”线来
只需将此类放入您的application / hooks目录
即可class AppAutoLoadObjects
{
private $arrPaths = array(
'objects/',
);
public function initialize()
{
spl_autoload_register(array($this,'autoloadObjects'));
}
public function autoloadObjects($class)
{
if (strpos($class, 'CI_') !== 0)
{
foreach ($this->arrPaths as $dir)
{
$this->counter++;
if (file_exists(APPPATH . $dir . '/' . $class . '.php'))
{
require_once(APPPATH . $dir . '/' . $class . '.php');
return;
}
}
}
}
}
并在application / config / hooks.php
中$hook['pre_system'] = [
[
'class' => 'AppAutoLoadObjects',
'function' => 'initialize',
'filename' => 'AppAutoLoadObjects.php',
'filepath' => 'hooks'
]
];