- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我几个月前开始使用CakePHP (1.2) 为公司的应用程序添加一些小功能,我对它不太熟悉。
在合并到生产服务器之前,我们先在开发服务器上进行本地测试。
我希望每小时调用一次 Controller 操作,通过我的研究,我认为这是执行此操作的最佳方式,一个 cron 作业。
尝试 1
看完这些,
http://book.cakephp.org/1.2/en/view/110/Creating-Shells-Tasks
我可以毫无错误地执行某些操作,但操作未执行。
基于这些示例,我在我的应用程序目录(不是 app/webroot)中添加了一个名为 cron_dispatcher.php 的文件,然后从应用程序目录执行此命令
php cron_dispatcher.php /controller/action/param
仍然没有任何反应,但当我通过 url 调用它时,它工作得很好。
尝试 2
我尝试创建一个 shell (email.php) 来调用/app/vendors/shells/中的操作。
<?php
class EmailShell extends Shell {
public function main() {
$this->out('Test');
}
}
?>
这成功地在控制台输出测试
cake email main
但后来我找不到如何调用 Controller 的操作。我试过了
$this->requestAction('/controller/action');
我还尝试从与 shell 中的 main 不同的函数进行调用。
我曾尝试像使用模型一样将 Controller 包含在 $uses 变量中,但这没有用(我认为这没有意义)
我不认为创建任务是解决方案,因为我不想复制 sendEmails 函数,因此我正在寻找一种方法来从 shell 或其他任何地方调用 Controller 的操作!
我可能缺少一些理论,谢谢
解决方案
我将一些方法从 Controller 移到了模型中,并且能够从 shell 中调用它们。
App::import('Component', 'Email');
class SendMemosShell extends Shell {
var $uses = array(
'Memo',
);
public function main() {
}
public function sendEmails () {
$this->Email =& new EmailComponent(null);
$memoList = $this->Memo->getMemos();
//...
}
}
此链接有帮助 http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html
编辑:澄清了一些信息并添加了解决方案
最佳答案
其实这是一个很常见的问题,也遇到过。
Controller 正在决定如何处理请求并启动该任务。在这种情况下,不需要 Controller ,因为您有一个 shell 任务,任务已经很清楚了。
知道这一点,调用 Controller 方法就没有意义了。
所以重新考虑您的选择,是的,这是一个相当困难的选择。例如,您可能决定发送电子邮件是一个业务逻辑步骤,因此它应该在模型中。另一种选择是将其完全分离(这是我们最喜欢的)。
在这种情况下,您必须创建一个队列,将所有要发送的电子邮件放入其中。这是一个很好的设计,因为你知道 Controller 中的逻辑数量下降并且它们是分开的。这样您就可以获得电子邮件服务。
例如,您可以要求服务发送一封“新用户”邮件。然后将 User 对象添加到它,它应该会自行处理。这样你甚至可以扩展,因为你的服务可以外包,你可以在服务上扩展多个服务器等。
编辑:
好问题。
采取的步骤:
首先集中“发送电子邮件”流程。因此,选择一个位置放置它。您可以决定:将电子邮件添加到队列或直接调用该服务。例如,您可以添加用于发送电子邮件的 shell 任务。
调用 shell:现在你遇到了调用 shell 的问题。一般来说,你不想。为什么不?因为一个 shell(一个任务)可以运行很长时间。所以这就是我们在两者之间使用队列的原因。因此,您可以询问队列或让队列向您发送某事已完成的消息。例如,考虑一个已关闭的邮件服务器。您必须重试等。这不应该出现在 Web 请求中,因为用户正在等待响应。
第三步是从您的 cron 调用 shell,现在这很容易,因为您已经在命令行上,因此您可以使用标准调用。
无论如何,有一些选项可以直接从 Controller 调用,但你不应该这样做。这篇文章提供了一些非常有趣的见解: CakePHP: Run shell job from controller
编辑 31/08/'13:一些示例也参见 CakePHP 的事件系统:http://book.cakephp.org/2.0/en/core-libraries/events.html
关于php - Cakephp cron 作业调用 Controller 的 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266385/
Yii::$app->runAction('new_controller/new_action', $params); 我相信这可以用来从另一个 Controller 调用 Controller Ac
这个问题类似于 this ,但我需要访问父成员(不是控制)。我不知道是否可以不使用依赖注入(inject)。 例如,我有一个父级,有一个成员调用用户,我需要从子 Controller 访问用户。 最佳
我有包含 2 个布局的根布局:- 选项面板- 绘制区域 我正在尝试的是访问 OptionsPaneController 中的 DrawAreaController 以调用其绘制方法。下面是 Optio
我的应用程序的 View Controller 层次结构设置如下: UIViewController | UITabBarController | UINavigationCo
我的应用程序的 View Controller 层次结构设置如下: UITabBarController | UINavigationController | | |
当我第一次为我目前在 Storyboard 中开发的应用程序创建基础布局时,我分两步完成: 选择我的 View Controller 并使用 Editor->Embed In->Navigation
设计要求: 显示用户可以选择的项目列表 选择一个项目后,使用后退按钮将用户带到一个新 View 。新 View 应在底部包含第一个屏幕中不存在的选项卡列表 单击选项卡中的项目时,应出现一个带有后退按钮
将父 Controller 设置为“parentCtrl as vm”,并将子 Controller 设置为“childCtrl as vmc”,以避免名称冲突,并且效果良好。 如何在子 Contro
我已经阅读了一些答案,例如关闭当前的 ViewController,但我的情况有所不同,因为我正在展示另一个 ViewController。 虽然我无法访问它的属性,但此代码显示了带有导航 Contr
如我所见,如果我们要实例化一个Model(例如,名为Post),我们只需调用: $post = new Post(); 现在,我还想实例化一个Controller(例如,名为Post,并为此 Cont
我已经疯狂地在整个网络上搜索解决我的问题的方法,但目前还没有。我的问题是我必须检查是否在 HTTP 请求中获得特定文本,该请求在一个 while 循环中,如果我这样做了,那么我应该离开循环并继续线程,
我想用this.get('controllers.pack.query');要得到App.PackQueryController在 App.PackController ,但失败了。 我认为问题是 E
我刚开始使用 Laravel。当我使用 codeigniter 或 zend 框架时,我可以将我的 Controller 组织到一个单独的目录中。例如,我可以创建“user/permission.ph
在 emberjs 前 2 我们可以从另一个 Controller 访问 Controller 或 Controller 中的任何方法 以下方式: App.get('router').get('nav
这可能是非常简单的实现,但我是 iOS 编程的新手,我似乎被卡住了。 所以,基本上,我有一个选项卡式应用程序。我决定除了标签栏之外还需要一个导航栏。为此,我放置了标签栏 Controller ,然后添
我有这个列表 Controller , define([ 'jquery', 'app' ], function ($,app) { app.controller("ListC
我有 3 个 Controller :RootController、FirstController 和 SecondController。我想从 RootController -> FirstCont
我有以下 Controller : /controllers/api/base_controller.rb /controllers/api/v1/articles_controller.rb 当为文
我是 Angular JS 的新手,尝试在另一个 Controller 中调用一个 Controller ,但出现以下错误。 ionic.bundle.js:21157 TypeError: $con
我有一个标签栏 Controller 和它的 3 个 child ,我还有另一个 View ,我制作了一个从 child 到 View Controller 的自定义转场,还有一个从 View Con
我是一名优秀的程序员,十分优秀!