Php CodeIgniter是否必须在最后一步加载视图?

Php CodeIgniter是否必须在最后一步加载视图?,php,codeigniter,asynchronous,task,Php,Codeigniter,Asynchronous,Task,我有一个函数 function do_something() { // process $this->load->view('some_view', $data); exec('mv /path/to/folder1/*.mp3 /path/to/folder2/'); } 我的目的是在输出视图后移动文件。但显然,这是在渲染视图之前完成的。我的问题是,$this->load->view()必须是函数中的最后一步吗 我做了一点调查,我的问题似乎和你的相似。正确

我有一个函数

function do_something() {
    // process
    $this->load->view('some_view', $data);
    exec('mv /path/to/folder1/*.mp3 /path/to/folder2/');
}
我的目的是在输出视图后移动文件。但显然,这是在渲染视图之前完成的。我的问题是,
$this->load->view()必须是函数中的最后一步吗


我做了一点调查,我的问题似乎和你的相似。正确吗?

在运行命令之前,将输出发送到浏览器:

function do_something()
{
    // process
    echo $this->load->view('some_view', $data, TRUE);
    exec('mv /path/to/folder1/*.mp3 /path/to/folder2/');
}
否则,您只是将数据提供给输出类,该类将在控制器完成后立即运行。

否。 实际上,对于一些web服务,我刚刚使用了如下内容:

function get_json_search() {
    $results = $this->My_model->get_stuffs();
    echo json_encode($results);
}
class Home extends Controller {

    // Initalize the var to avoid having to
    // check if it's set or not

    var $move_audio = FALSE;

    // CONTROLLER METHOD    
    function index()
    {
        $this->move_audio = TRUE;
        $this->old_folder = "/path/to/folder/";
        $this->new_folder = "/path/to/folder2/";

        $this->load->view("some_view");
    }

    // OUTPUT HANDLER
    function _output($output = "")
    {
        echo $output;

        if($this->move_audio === TRUE)
        {
            // Trim, then add trailing slash for consitency
            $old_folder = rtrim($this->old_folder, "/")."/*.mp3";
            $new_folder = rtrim($this->new_folder, "/")."/";

            exec("mv {$old_folder} {$new_folder}");
        }
    }
}
您还可以拥有完全私有的控制器功能。只需在它们前面加上“u”。您永远不会将这些视为页面

function _upload_photo($filepath) { //resize it and so on
也许你误解了MVC。控制器是模型和视图之间的中介。同样,您也不需要使用模型。控制器只是从模型中获取内容并使用视图将其打印出来。您没有理由(尽管这可能是不好的样式)无法使用来自控制器内部或其他来源的数据,或者无法从控制器打印页面

如果先加载视图,我不明白为什么它不起作用。虽然我会用另一种方式,这样你可以给用户提供反馈。如果文件无法移动,您应该向他们显示一个错误。如果是性能密集型的,考虑使用队列或CRON作业。< /P> <代码>
<?php
    while (ob_get_level()) {
        ob_end_flush();
    }
    // start output buffering
    if (ob_get_length() === false) {
        ob_start();
    }

    class Something extends Controller {

        function do_something() {
            $this->load->view('some_view', $data);
            ob_flush(); flush();
            exec('mv /path/to/folder1/*.mp3 /path/to/folder2/');
        }
    }
?>

为什么不使用
post\u系统
hook?它在最后一页发送到浏览器后调用,这样您就可以正常加载视图,而无需回显它们

下面是一个示例控制器:

class Home extends Controller {

    function index()
    {
        $this->move_audio = TRUE;
        $this->old_folder = "/path/to/folder/";
        $this->new_folder = "/path/to/folder2/";

        $this->load->view("some_view");
    }

}
还有一个例子:

function post_system()
{
    $CI =& get_instance();

    if( isset($CI->move_audio) && $CI->move_audio === TRUE)
    {
        // Trim, then add trailing slash for consitency
        $old_folder = rtrim($CI->old_folder, "/")."/*.mp3";
        $new_folder = rtrim($CI->new_folder, "/")."/";

        exec("mv {$old_folder} {$new_folder}");
    }
}
有关设置它们的信息,请查看。他们是你的朋友

编辑:我刚刚想到的东西…

如果只在一个控制器方法中执行此操作。。。使用菲尔的方法可能会更好。这将避免对每个请求进行钩子调用,如果您只需要一次,那么钩子调用是不必要的

如果只需要一次,您可以做的另一件事是使用CI的
\u output()
控制器处理程序()。这将是这样的:

function get_json_search() {
    $results = $this->My_model->get_stuffs();
    echo json_encode($results);
}
class Home extends Controller {

    // Initalize the var to avoid having to
    // check if it's set or not

    var $move_audio = FALSE;

    // CONTROLLER METHOD    
    function index()
    {
        $this->move_audio = TRUE;
        $this->old_folder = "/path/to/folder/";
        $this->new_folder = "/path/to/folder2/";

        $this->load->view("some_view");
    }

    // OUTPUT HANDLER
    function _output($output = "")
    {
        echo $output;

        if($this->move_audio === TRUE)
        {
            // Trim, then add trailing slash for consitency
            $old_folder = rtrim($this->old_folder, "/")."/*.mp3";
            $new_folder = rtrim($this->new_folder, "/")."/";

            exec("mv {$old_folder} {$new_folder}");
        }
    }
}

知道为什么这是-1吗?在CodeIgniter方法中使用echo没有什么错。它应该会有所帮助,但我对我的答案进行了一点编辑,因为如果您只需要一个控制器和一个方法的功能,那么这种方法就没有意义了