我已经阅读了几篇非常接近我要问的问题的帖子,但我仍然没有掌握 MVC 方式。一个例子很接近,标题为“Codeigniter db query on two tables”,但我得到了“Undefined property”错误,这强化了我没有正确调用对象的事实。我宁愿不使用 DataMapper,因为如果我需要出去学习其他课程,那么我可能会回到程序编码路线。我对了解这个框架实现的工作原理感到有点兴奋。
我有两张表,我们称一张为“应用程序”,另一张为“映射”。“应用程序”是使用 apache 作为反向代理配置的应用程序,如下所示:ProxyPass /mapping/ https:/// ProxyPassReverse /mapping/ https:///
一些应用程序可以请求多个反向代理映射,因此它是一个 1-many 设计。
我的目标是对应用程序表使用 select 语句,然后从该表中打印出我想要的每一列:例如,我目前在我的“应用程序”表中定义了两个应用程序,其中一个应用程序有两个反向代理映射,另一个有一个。来自apps 表的数据下方的prxypass 行将来自apps_mapping 表。
App: App ABC
Owner: ABC Team
Date Requested: 2013-10-27
ProxyPass /ABC-Resource/ https://<to-some-internal-URL>/
ProxyPassReverse /ABC-resource/ https://<to-some-internal-URL>/
App: App XYZ
Owner: XYZ Team
Date Requested: 2013-10-27
ProxyPass /XYZ-mapping/ https://<to-some-internal-URL>/
ProxyPassReverse /XYZ-mapping/ https://<to-some-internal-URL2>/
ProxyPass /anothermapp/ https://<to-some-internal-URL>/
ProxyPassReverse /anothermapping/ https://<to-some-internal-URL2>/
我试图通过修改他们的 user_guide 中 CodeIgniter 示例提供的教程来模拟我第一次使用 CodeIgniter 的尝试。
现在我所拥有的。型号类:
<?php
class Prp_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
//GET APP THE ROWs FROM THE apps TABLE
public function get_appsUsingPrp()
{
$query = $this->db->get('apps');
return $query->result_array();
}
//GET THE MAPPINGS FROM THE apps_mappings TABLE
//FOR EACH APP BY WAY OF UNIQUE id IN THE appsTABLE
public function get_prpMappings($id = FALSE)
{
$query = $this->db->get_where('apps_mappings', array('resourceID' => $id));
return $query->result_array();
}
?>
对于上面的类,我应该把它放在一个变量中,而不是在 get_prpMappings() 上使用返回函数吗?即便如此,如何在名为 int he views page 的代码中为 $id 提供一个值?
控制器类
<?php
class Prp extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('prp_model');
}
public function index()
{
$data['apps'] = $this->prp_model->get_prp();
$data['mappings'] = $this->prp_model->get_prpMappings($id);
$data['title'] = 'PRP archive';
$this->load->view('templates/header', $data);
$this->load->view('prp/index', $data);
$this->load->view('templates/footer');
}
public function view($id)
{
$data['apps'] = $this->prp_model->get_prp();
$data['mappings'] = $this->prp_model->get_prpMappings($id);
}
}
看法
<?php
print_r($apps);
print_r($mappings);
foreach ($apps as $details): ?>
<div id="main">
<ul>
<?php echo "<li>App Name: ".$details['app_name'] ?>
<?php echo "<li>EPRID: ".$details['EPRID'] ?>
<?php echo "<li>Requestor: ".$details['requestor'] ?>
<?php echo "<li>Team PDL: ".$details['PDL'] ?>
<?php foreach ($mappings as $map): ?>
<?php echo "<li>ProxyPass /".$map['resource']."/ ".$map['destURL'] ?>
<?php echo "<li>ProxyPassReverse /".$map['resource']."/ ".$map['destURL'] ?>
<?php endforeach ?>
</ul>
</div>
<hr />
<?php endforeach ?>
?>
陷入我的困惑......如果我不打算设置 DataMapper 类,我是否应该在模型和/或控制器类中进行所有 foreach 循环?
有没有办法直接在视图中调用模型类中定义的get_prpMappings($id)函数?该功能为我工作的唯一方法是在遍历行时提供应用程序行的 id。
我试着把 $this->prp_model->get_prpMappings($id); 在视图中,但视图页面似乎无法识别该类。
最后.. 从表面上看,我似乎会使用框架(例如 CodeIgniter 或 Zend)进行更多编码,然后就是从头开始编写所有内容。但我的印象是,该框架是为了在附加编码的道路上提供便利。我只是没看到。请帮忙。
更新!我希望我明白这一点。
我已经修改了我的逻辑来表达所需的输出。你能告诉我这是否是一种低效的方式吗?这是逻辑:模型类:
<?php
class Prp_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
//GET APP THE ROWs FROM THE sharedITG TABLE
public function get_appsUsingPrp()
{
$query = $this->db->get('sharedITG');
return $query->result_array();
}
//GET THE MAPPINGS FROM THE sharedITG_mappings TABLE
//FOR EACH APP BY WAY OF UNIQUE id IN THE shareITG TABLE
public function get_prpMappings($id = FALSE)
{
$this->db->select('resourceID, resource, destURL');
$query = $this->db->get_where('sharedITG_mappings', array('resourceID' => $id));
return $query->result_array();
}
public function get_prp()
{
//loop through all apps
foreach ($this->get_appsUsingPrp() as $app)
{
//print_r($app);
foreach ($this->get_prpMappings($app['id']) as $mappings)
{
$map[] = $mappings;
}
}
return $map;
}
}
控制器类
<?php
class Prp extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('prp_model');
}
public function index()
{
$data['mappings'] = $this->prp_model->get_prp();
$data['apps'] = $this->prp_model->get_appsUsingPrp();
$data['title'] = 'PRP archive';
$this->load->view('templates/header', $data);
$this->load->view('prp/index', $data);
$this->load->view('templates/footer');
}
public function view($id)
{
$data['apps'] = $this->prp_model->get_appsUsingPrp();
$data['mappings'] = $this->prp_model->get_prp();
}
}
查看代码:
<?php
//print_r($apps);
//print_r($mappings);
foreach ($apps as $details): ?>
<div id="main">
<ul>
<?php echo "<li>App Name: ".$details['app_name'] ?>
<?php echo "<li>EPRID: ".$details['EPRID'] ?>
<?php echo "<li>Requestor: ".$details['requestor'] ?>
<?php echo "<li>Team PDL: ".$details['PDL'] ?>
<?php
foreach ($mappings as $map)
{
if ($details['id'] == $map['resourceID'])
{
echo "<li>ProxyPass /".$map['resource']."/ ".$map['destURL'];
echo "<li>ProxyPassReverse /".$map['resource']."/ ".$map['destURL'];
}
}
?>
</ul>
</div>
<hr />
<?php endforeach ?>