我有一个控制器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
?>
我应该在这个文件中写什么......
提前致谢
答案 0 :(得分:1)
我知道这已经有几年了,这可能不是类/函数的预期用途,但是我发现以下内容在从命令行调用的隔离文件中非常有用。
这解决的问题是它消除了Apache进程的产生。解决方案很棒,因为我可以从URL访问所需的一些Controller / Action。
在几乎所有基于ZF1的应用程序中,您都可以复制索引文件并保持所有内容相同,只需注释掉以下行。
$application->run();
您可以使用自动加载器等访问此行以下的任何内容。它非常粗糙,但它可以正常工作。不幸的是,您很快就会发现自己对应用程序所拥有的大量文件的访问权限有限,并且您可以通过控制器/操作来访问所需文件的唯一方法就是感觉。
相反,我在$ application-&gt; bootstrap()下面的新文件中使用以下内容(仍然删除$ application-&gt; 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文件,它可以为您的主要index.php引导所有内容,但您可以根据需要手动触发控制器/操作,从而可以更轻松地访问其余文件ZF1打算如何访问它们。
答案 1 :(得分:0)
控制器旨在用于MVC,而不是脚本。您的控制器应该组装请求变量,将它们引导到模型并返回某种类型的HTTP响应。您的脚本应该直接在模型上运行。
无论如何,如果你坚持,你可以实例化一个控制器类,并像任何其他类一样调用方法,只要你注入MVC所具有的依赖关系。
答案 2 :(得分:0)
您不必为此调用控制器操作,您的逻辑应该驻留在您的模型中。然后,您可以创建模型的新实例并调用适当的方法。例如:
require_once '/path/to/mymodel.php';
$mymodel = new Mymodel();
$data = $mymodele->fetchAll();
PS:也许您应该考虑创建一个restful api来处理来自应用程序外部的调用
<强>更新强>:
好吧,我现在看到你需要的东西,实现它的最好方法是调用一个url而不是一个文件(例如website.com/emails/send),如果你担心安全性,你可以使用一些预共享密钥为了确保请求来自您,请将其与请求一起发送,并检查您的操作是否正确。答案 3 :(得分:0)
如果你想在你的行动中的多个地方使用逻辑,那么它应该放在一个动作助手或非常通用的代码中,然后放在一个自定义库中(/ library / custom /)
注意:身份验证更适合插件,而不是每个控制器中的预调度方法。