2

我有一个控制器 IndexController.php,其中的操作是这样的

class IndexController extends CustomControllerAction {


public function preDispatch() {


    if (!$this->view->authenticated) {


        $this->_redirect('/users/login');


    }


}

public function indexemailAction() {

  //somecode which calculates certain things

}

}

现在,我需要使用独立的 php 文件在 IndexController.php 中调用操作“indexmailAction”

php文件是indextest.php

 <?php
   //Need to write some code to call indexmailAction in IndexController.php

 ?>

我应该在这个文件中写什么......

提前致谢

4

4 回答 4

1

我知道这已经有几年的历史了,这可能不是类/函数的预期用途,但我发现以下内容在从命令行调用的独立文件中非常有用。

这为我解决的问题是它消除了 Apache 进程的产生。该解决方案很棒,因为我可以从 URL 访问所需的一些控制器/操作。

在几乎任何基于 ZF1 的应用程序中,您都可以复制索引文件并保持所有内容不变,只需注释掉以下行。

$application->run();

您可以使用自动加载器等访问此行下方的任何内容。它很粗糙,但它可以工作。不幸的是,您很快就会发现自己对应用程序拥有的许多文件的访问权限有限,并且感觉访问所需文件的唯一方法是通过 Controller/Action。

相反,我在 $application->bootstrap() 下的新文件中使用以下内容(仍然删除 $application->run() ):

$front = Zend_Controller_Front::getInstance();

// You can put more here if you use non-default modules
$front->setControllerDirectory(array(
        'default' => APPLICATION_PATH.'/controllers'
));

$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setNeverRender(true);

Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

$req = new Zend_Controller_Request_Http("http://anydomain.tld/controller/action");

// Example just to see how this can be extended
$req->setParam("someVar", "someValue");

$front->setRequest($req);

$front->dispatch();

最后,您有一个独立的 PHP 文件,该文件引导所有内容与您的 web 主 index.php 相同,但您可以根据需要手动触发控制器/动作,让您更轻松地访问 ZF1 的其余文件。您可以访问它们。

于 2016-11-29T02:14:41.937 回答
0

您不必为此调用控制器操作,您的逻辑应该驻留在模型中。然后,您可以创建模型的新实例并调用适当的方法。例子 :

require_once '/path/to/mymodel.php';
$mymodel = new Mymodel();
$data = $mymodele->fetchAll();

PS:也许你应该考虑创建一个restful api来处理来自应用程序外部的调用

更新

好的,我现在知道您需要什么了,实现它的最佳方法是调用 url 而不是文件(例如 website.com/emails/send),如果您担心安全性,可以使用一些预共享密钥来确保请求来自您,将其与请求一起发送并检查您的操作是否正确。

于 2013-03-20T05:09:34.070 回答
0

控制器被设计用于 MVC,而不是脚本。您的控制器应该组装请求变量,将它们定向到模型并返回某种 HTTP 响应。您的脚本应该直接作用于模型。

无论如何,如果您坚持,您可以像任何其他类一样实例化一个控制器类并调用方法,只要您注入 MVC 将具有的任何依赖项。

于 2013-03-20T04:54:20.650 回答
0

如果您希望在操作中的多个位置使用逻辑,则应将其放入操作助手中,或者如果代码非常通用,则应放入自定义库 (/library/custom/)

注意:身份验证更适合插件而不是每个控制器中的预调度方法。

于 2013-03-20T06:06:50.473 回答