0

我希望能够从 Cake Shell 调用 CakeS3 插件。但是,据我了解,无法从外壳加载组件。我已经阅读了这篇文章,概述了克服它的策略:在 Cakephp 2+ Shell 中使用组件-但是,我没有成功。这里的 CakeS3 代码类似于我的应用程序其余部分中完美运行的 Cake 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 自动执行一些上传当然,如果有更好的办法,我全都听好了。

4

3 回答 3

1

原谅我这个“广告”......;)但是如果我的插件使用的组件应该是模型或行为任务,那么它可能比这个 CakeS3 插件写得更好,并且具有更好的架构。它也是为您所拥有的用例而制作的。此外,它支持的存储系统比仅 S3 多一些。

例如,您可以在您的 shell 中执行此操作:

StorageManager::adapter('S3')->write($key, StorageManager::adapter('Local')->read($key));

文件应作为一个实体单独处理,该实体与它需要关联的任何内容相关联。每个上传的文件(如果您使用或扩展插件附带的模型,如果不是,则必须处理)存储为单个数据库条目,其中包含所使用配置的名称和一些元数据文件。如果您在 shell 中执行上面的代码行,如果您以后想以这种方式访问​​它,则必须在表中记录。只需检查readme.md中的示例即可。您不必使用数据库表作为对文件的引用,但我真的推荐插件实现的系统。

此外,您可能不知道 WWW_ROOT 是可公开访问的,因此如果您在其中存储敏感数据,则可以公开访问它。

最后,在 shell 中,您不应该使用 echo 而使用$this->out()来获得正确的 shell 输出。

于 2013-07-11T23:10:47.770 回答
0

我认为App:uses应该看起来像:

App::uses('CakeS3', 'CakeS3.Controller/Component');
于 2013-07-11T22:20:03.150 回答
0

我是 CakeS3 的作者,不,恐怕没有“支持”的方式来做到这一点,因为当我们构建这个插件时,我们不需要从 shell 运行上传,只需要一个简单的 S3 接口我们的控制器。然后,我们将插件开源为一个简单的 S3 连接器。

如果您想尝试修改它以支持 shell 访问,我欢迎 PR。

我没有针对该插件的特定路线图,因此我在 github 上将您的问题标记为增强功能,并且肯定会在未来的开发中考虑它,但我不能保证它符合您的时间要求,所以这就是为什么我提到你做公关。

于 2013-07-13T07:09:10.170 回答