Я хочу создать бэкэнд, который извлекает некоторую информацию и отображает ее обратно на объекты.
Например:
У меня есть это в моем классе модели:
<?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}
}
Это хороший подход, чтобы сделать это таким образом?
Вы должны сделать это в модели — так как Result Функции 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;
}
}
}
}
}
и в приложении / config / hooks.php
$hook['pre_system'] = [
[
'class' => 'AppAutoLoadObjects',
'function' => 'initialize',
'filename' => 'AppAutoLoadObjects.php',
'filepath' => 'hooks'
]
];
Других решений пока нет …