Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一个库应该调用另一个库,还是在Codeigniter和MVC中这是控制器的任务_Php_Codeigniter_Model View Controller_Fpdf_Loose Coupling - Fatal编程技术网

Php 一个库应该调用另一个库,还是在Codeigniter和MVC中这是控制器的任务

Php 一个库应该调用另一个库,还是在Codeigniter和MVC中这是控制器的任务,php,codeigniter,model-view-controller,fpdf,loose-coupling,Php,Codeigniter,Model View Controller,Fpdf,Loose Coupling,我必须在使用Codeigniter的应用程序中做出一些设计决策 我在controller中有一个方法,它调用库来创建PDF。 我还有一个类,它将数字作为参数并返回字符串(口头数字) 我想知道在所有这些班级之间传递数据的最佳实践是什么。控制器的任务是调用所有库(在步骤2和步骤3之间),并将所有准备好的数据提供给将创建PDF的模型。或者这是模型本身的任务,通过加载和调用将数字转换为字符串的类来转换提供的原始数据 在松散耦合、模块化和代码清晰性方面,最好的解决方案是什么 这是一个控制器: class

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

我在controller中有一个方法,它调用库来创建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 ? */

     }
 }

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

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


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

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

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

  • 用户要求:pdf/下载
  • 控制器Pdf触发下载方法
  • 下载触发模型并将数据推送到视图
  • 视图及其数据将返回到变量中
  • $view变量将被推送到Pdf库中
  • 触发pdf创建
  • Pdf触发Pdf下载(可选)
  • 控制器触发器重定向到pdf/overview

  • 所以我使用model将PDF保存在磁盘上。这是控制器不应该处理从模型中获取的数据的规则吗?他的角色不是加载库和助手吗?不,这就是我想说的。控制器应该处理从模型中获取的数据,而不是自己获取数据。在您的例子中,我认为如果您需要在模型和控制器上同时使用该函数,那么进行转换的函数应该是一个更好的助手。您不能(也不应该)在模型中加载控制器的函数。这正是我想要理解的。如果转换函数是一个可以由模型和控件加载的助手(在我的例子中是库),那么哪个位置执行这种操作更好?在控制器或模型中,我应该在哪里加载和调用helper/library?在MVC中,控制器只负责将用户请求中的适当数据传递到模型层。没有别的了。它不应该发送消息、呈现模板或类似的东西。底线是:CodeIgniter没有实现MVC或MVC启发的设计模式。所以模型应该发送电子邮件吗?CodeIgniter不实现MVC是什么意思?模型不是类或对象。这是一层。你可以读更长的解释。至于CodeIgniter:它没有视图。只有简单、愚蠢的模板。这迫使“控制器”中的UI逻辑中断了表示层的SoC。在大多数实现中,没有模型层。仅基于活动记录的实体的集合。这反过来又迫使控制器中的应用程序逻辑中断了模型层和表示层之间的SoC。您认为哪个框架最接近MVC的正确实现?框架不实现MVC。他们也不应该声称他们做到了。框架应该提供工具,让用户选择合适的体系结构。在PHP版本中,符合此描述的是Zend Framework 2.x和Symfony 2.x。。此外,新的Laravel可能值得一试,它已经摆脱了rails的克隆思维。同样,如果您想制作一个基于MVC的应用程序,就不需要使用框架。从框架学习MVC就像从Wordpress学习良好的编程实践。可以肯定的是,这是一个创建PDF的库(精确的模型),它应该加载并调用其他帮助程序和库来转换和格式化从controller传递的原始数据?我喜欢从restful的角度看它。例如:订单是一个对象,因此您将有一个名为订单的模型、一个名为订单的控制器和多个视图:列表(多个订单)、详细信息、更新。如果您需要PDF格式的订单,请加载PDF creator库。如果此库依赖于其他库、帮助程序等,NP!就用它们吧。(个人)我尽量避免库依赖于模型、视图或其他控制器,但不依赖于帮助器和其他库。。没问题。