我有一个运行良好的CakePHP 1.3.11站点,我需要运行一个计划的维护CLI脚本,所以我用PHP编写它。有没有办法制作一个蛋糕友好的脚本?理想情况下,我可以使用Cake的函数和Cake的数据库模型,CLI需要数据库访问,而不是其他。理想情况下,我希望将CLI代码包含在控制器中,将数据源包含在模型中,这样我就可以像调用任何其他Cake函数一样调用该函数,但只能从CLI调用这个函数。
搜索CakePHP CLI主要会带来有关CakeBake和cron作业的结果; this article听起来非常有用,但它适用于旧版蛋糕,需要修改版本的index.php。我不再确定如何更改文件以使其在新版本的cakePHP中运行。
如果重要的话,我在Windows上,但我可以完全访问服务器。我目前正计划安排一个简单的cmd“php run.php”样式脚本。
答案 0 :(得分:5)
使用CakePHP的shell,您应该能够访问所有CakePHP应用程序的模型和控制器。
作为一个例子,我设置了一个简单的模型,控制器和shell脚本:
/app/models/post.php
<?php
class Post extends AppModel {
var $useTable = false;
}
?>
/app/controllers/posts_controller.php
<?php
class PostsController extends AppController {
var $name = 'Posts';
var $components = array('Security');
function index() {
return 'Index action';
}
}
?>
/app/vendors/shells/post.php
<?php
App::import('Component', 'Email'); // Import EmailComponent to make it available
App::import('Core', 'Controller'); // Import Controller class to base our App's controllers off of
App::import('Controller', 'Posts'); // Import PostsController to make it available
App::import('Sanitize'); // Import Sanitize class to make it available
class PostShell extends Shell {
var $uses = array('Post'); // Load Post model for access as $this->Post
function startup() {
$this->Email = new EmailComponent(); // Create EmailComponent object
$this->Posts = new PostsController(); // Create PostsController object
$this->Posts->constructClasses(); // Set up PostsController
$this->Posts->Security->initialize(&$this->Posts); // Initialize component that's attached to PostsController. This is needed if you want to call PostsController actions that use this component
}
function main() {
$this->out($this->Email->delivery); // Should echo 'mail' on the command line
$this->out(Sanitize::html('<p>Hello</p>')); // Should echo <p>Hello</p> on the command line
$this->out($this->Posts->index()); // Should echo 'Index action' on the command line
var_dump(is_object($this->Posts->Security)); // Should echo 'true'
}
}
?>
整个shell脚本用于演示您可以访问:
constructClasses()
方法,然后运行特定组件的initialize()
方法,如上所示。$uses
属性中)。你的shell可以有一个始终先运行的启动方法,以及main方法,它是你的shell脚本主进程,在启动后运行。
要运行此脚本,您需要在命令行中输入/path/to/cake/core/console/cake post
(可能必须检查在Windows上执行此操作的正确方法,该信息位于CakePHP手册中(http://book.cakephp.org)。 / p>
上述脚本的结果应为:
mail
<p>Hello</p>
Index action
bool(true)
这对我有用,但也许那些在CakePHP shell中更先进的人可以提供更多的建议,或者可能更正上面的一些......但是,我希望这足以让你开始。
答案 1 :(得分:0)
从CakePHP 2开始,shell脚本现在应保存到\ Console \ Command。 http://book.cakephp.org/2.0/en/console-and-shells.html
上有很好的文档