【问题标题】:Should one library call another or is it a task of controller in Codeigniter and in MVC in general一个库应该调用另一个库还是 Codeigniter 和 MVC 中的控制器任务?
【发布时间】:2013-04-04 08:00:24
【问题描述】:

我必须使用 Codeigniter 在我的应用程序中做出一些设计决定。

我在控制器中有一个方法,它调用一个库来创建 PDF。 另外我有一些类将数字作为参数并返回字符串(口头数字)。

我想知道在所有此类之间传递数据的最佳做法是什么。这是控制器调用所有库(在步骤 2 和步骤 3 之间)并将所有准备好的数据提供给将创建 PDF 的模型的任务吗?或者这是模型本身的任务,通过加载和调用将数字转换为字符串的类来转换提供的原始数据。

就松散耦合以及代码的模块化和清晰度而言,最佳解决方案是什么。

这是一个控制器:

class Payu extends CI_Controller
{
     public function raport($task_id)
     {
           /* (step 1) Load necessarty models */
           $this->load->model('MTasks');
           $this->load->model('mpdfinvoice');

           /* (step 2) task details from DB */
           $task_details = $this->MTasks->getTaskDetails($task_id);

           /* (step 3) create PDF that will be send */
           $this->mpdfinvoice->pdf($task_details);

           /* (step 4) compose an email with attached pdf */
           $this->email->from($this->config->item('noreply_email'));
           $this->email->to($task_details['email']);
           $this->email->attach('invoiceJustCreated.pdf');
           $this->email->subject('opłaciłes to zlecenie');
           $message = 'some message goes here';
           $this->email->message($message);
           $this->email->send();


     }
}


 This is a model that creates PDF file (called by controller)

 class mpdfinvoice extends CI_Model
 {
     public function pdf($task_details)
     {
          /* (step 1) load necesary library and helper */
          $this->load->library(array('fpdf' ));
          $this->load->helper('file');

          /* (step 2) set PDF page configuration*/              
          $this->fpdf->AddPage();
          $this->fpdf->AddFont('arialpl','','arialpl.php');
          $this->fpdf->SetFont('arialpl','',16);

          /* (step 3) show data on PDF page */              
          $this->fpdf->cell('','',$task_details['payment_amount'] ,1);

          /*  I want to have "payment amount" verbally here 
              So Should I load and call the convert class here or
              should I have this data already prepared by the controller
              and only output it ? */

     }
 }

【问题讨论】:

  • 在 MVC 中,控制器只负责将适当的数据从用户请求传递到模型层。没有其他的。它不应该发送消息、渲染模板或类似的东西。底线是:CodeIgniter 没有实现 MVC 或 MVC 启发的设计模式。
  • 那么模型应该发送电子邮件吗? CodeIgniter 没有实现 MVC 是什么意思?
  • 模型不是类或对象。它是一层。你可以阅读更长的解释here。至于 CodeIgniter:它没有视图。只有简单、愚蠢的模板。这会强制“控制器”中的 UI 逻辑,破坏表示层的 SoC。而且在大多数实现中,没有模型层。仅基于活动记录的实体的集合。这反过来又强制控制器中的应用程序逻辑,打破模型层和表示层之间的 SoC。
  • 您认为哪个框架最接近正确的 MVC 实现?
  • 框架不实现 MVC。他们不应该声称他们这样做了。框架应该提供工具,让用户选择合适的架构。在 PHP-verse 中,符合此描述的将是 Zend Framework 2.x 和 Symfony 2.x .. 此外,可能值得尝试新的 Laravel,它已经摆脱了 rails-clone 的心态。再说一次,如果你想制作一个基于 MVC 的应用程序,就没有必要使用框架。从框架中学习 MVC 就像从 Wordpress 中学习良好的编程实践一样。

标签: php codeigniter model-view-controller fpdf loose-coupling


【解决方案1】:

尝试将 codeigniter 中的控制器视为数据粘合剂。控制器从客户端检索数据,对其进行标准化并触发适当的操作(重定向、触发库、视图、模型和帮助程序,同时使用提供的数据。)

在您的情况下,只需使用控制器从您的模型或用户输入中检索数据。然后将其传递给创建 pdf 的库。如果 pdf 创建成功,则返回 true 让控制器知道它是成功的。创建 flashdata 成功消息并重定向到输出视图的页面:

  1. 用户请求:pdf/下载
  2. Controller Pdf触发下载方法
  3. 下载触发模型并将数据推送到视图
  4. 视图及其数据将返回到变量中
  5. $view 变量将被推送到 Pdf 库中
  6. 触发pdf创建
  7. PDF 触发 pdf 下载(可选)
  8. 控制器触发器重定向到 pdf/overview

【讨论】:

  • 只是为了确定 - 这是创建 PDF 的库(精确模型),它应该加载和调用其他帮助程序和库来转换和格式化从控制器传递的原始数据?
  • 我喜欢从宁静的角度来看待它。例如:Order 是一个对象,因此您将拥有一个名为 Order 的模型、一个名为 Orders 的控制器和多个视图:列表(多个订单)、详细信息、更新。如果您需要 PDF 格式的订单,请加载 PDF 创建者库。如果这个库依赖于其他库、助手等,NP!只需使用它们。 (个人)我尽量避免库依赖于模型、视图或其他控制器,但助手和其他库..没问题。
【解决方案2】:

我建议创建 PDF 或任何其他文件以及值之间的所有转换都发生在模型上,然后控制器决定从模型中获取哪些数据,以便将其传递给适当的视图和它会知道如何显示它。

控制器不应用于直接显示(输出)数据或访问数据库和创建文件。

此外,任何情况下都不应使用模型来输出数据。

【讨论】:

  • 所以我使用模型将 PDF 保存在磁盘上。那么这是控制器不应该处理从模型中获取的数据的规则吗?他的职责不是加载库和帮助程序吗?
  • 不,这就是我想说的。控制器应该处理从模型中获取的数据,但不能自己获取它们。在您的情况下,我认为如果您需要在模型和控制器上都使用它,那么进行转换的函数应该是一个 Helper。您不能(也不应该)在模型中加载控制器的功能。
  • 这正是我想要理解的。如果转换函数是模型和控制器都可以加载的帮助器(或在我的情况下为库),那么哪个地方更好地执行此类操作?我应该在哪里加载和调用助手/库 - 在控制器或模型中?
猜你喜欢
  • 2015-12-25
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2012-01-06
  • 2010-09-25
  • 1970-01-01
相关资源
最近更新 更多