我希望能够从Cake Shell调用CakeS3插件。但是,据我所知,它无法从shell加载组件。我已经阅读了这篇文章,概述了克服它的策略:using components in Cakephp 2+ Shell - 然而,我没有成功。这里的CakeS3代码类似于我的应用程序其余部分中功能完善的蛋糕S3代码。
<?php
App::uses('Folder','Utility');
App::uses('File','Utility');
App::uses('CakeS3.CakeS3','Controller/Component');
class S3Shell extends AppShell {
public $uses = array('Upload', 'User', 'Comment');
public function main() {
$this->CakeS3 = new CakeS3.CakeS3(
array(
's3Key' => 'key',
's3Secret' => 'key',
'bucket' => 'bucket')
);
$this->out('Hello world.');
$this->CakeS3->permission('private');
$response = $this->CakeS3->putObject(WWW_ROOT . '/file.type' , 'file.type', $this->CakeS3->permission('private'));
if ($response == false){
echo "it failed";
} else {
echo "it worked";
}
}
这会在/home/app/Console/Command/S3Shell.php中找到“致命错误:类'CakeS3'的错误。我试图让它工作的主要原因是我可以自动执行一些上传有一个cron。当然,如果有更好的方法,我都是耳朵。
答案 0 :(得分:1)
请原谅我这个“广告”...;)但my plugin可能写得更好,并且拥有比这个CakeS3插件更好的架构,如果它使用的组件应该是模型或行为任务。它也是为了你的用例而准备的。此外,它还支持比S3更多的存储系统。
你可以在你的shell中做到这一点:
StorageManager::adapter('S3')->write($key, StorageManager::adapter('Local')->read($key));
文件应作为一个实体来处理,并与需要关联的任何内容相关联。每个上传的文件(如果你使用或扩展插件附带的模型,如果不是你必须要处理它)被存储为单个数据库条目,其中包含所使用的配置的名称和一些元数据。文件。如果你在shell中执行上面的代码行,如果你想稍后以这种方式访问它,你将不得不在表中保留记录。只需查看readme.md中的示例即可。您不必使用数据库表作为对文件的引用,但我真的建议插件实现的系统。
此外,您可能不知道WWW_ROOT是公共可访问的,因此如果您将敏感数据存储在那里,则可以公开访问它。
最后在shell中你不应该使用echo而是使用$this->out()来获得正确的shell输出。
答案 1 :(得分:0)
我认为App:uses
应该是这样的:
App::uses('CakeS3', 'CakeS3.Controller/Component');
答案 2 :(得分:0)
我是CakeS3的作者,并且我不担心没有“支持”方式来做这个,因为当我们构建这个插件时,我们不需要从shell运行上传而只需要一个简单的界面从我们的控制器到S3。然后我们将插件作为简单的S3连接器开源。
如果您想修改它以支持shell访问,我欢迎PR。
我没有针对该插件的特定路线图,所以我在github上将您的问题标记为增强版,并且在将来的开发中肯定会考虑它,但我无法保证它符合您的时间要求这就是为什么我提到你做公关。