3

我有一个流包装器,配置为使用Gaufrette包与 amazon s3 一起管理文件系统。我可以使用assetic成功转储资产,我当前的配置如下:

knp_gaufrette:
    adapters:
        amazon:
            amazon_s3: 
                amazon_s3_id: site_store.s3
                bucket_name: %site_store.bucket_name%
                create: true

    filesystems:
        amazon:
            adapter: amazon

    stream_wrapper:
        protocol: s3
        filesystems:
            - amazon

assetic:
    read_from:      %cdn_path_prod%
    write_to:       %cdn_path_prod%

和我的参数:

  cdn_url_prod: "http://images.site.com/"
    cdn_path_prod: "s3://amazon"

我能够执行应用程序/控制台资产:转储 --env=dev。然后它将资产成功上传到我的 s3 存储桶。但是,当我尝试通过执行以下操作对资产安装执行相同操作时:

app/console assets:install s3://amazon

它给了我这个错误:

[InvalidArgumentException]  
The specified path (s3://amazon) is invalid.

我查看了网络,有人能够按照他在此处的描述进行操作。我的蒸汽包装机有什么问题?

4

2 回答 2

2

您确定任何流包装器都已注册以处理“s3://”方案吗?

https://github.com/Cyber​​nox /AmazonWebServicesBundle/blob/master/Resources/ doc/cdn.md#dump-assets-to-the-s3-bucket 中,您将看到他们如何注册流包装器以便能够将资产转储到“s3://”目标。

于 2013-04-26T13:54:57.100 回答
2

所以我做了什么,它正在工作。

添加composer.json并安装它

"aws/aws-sdk-php": "2.6.16",

创建类:

<?php

namespace My\AcmeBundle\Amazon;

use Aws\Common\Aws;

class StreamWrapperS3 {

    protected $s3;

    public function __construct($key, $secret, $region) {

        $aws = array(
            'key'    => $key,
            'secret' => $secret,
            'region' => $region
        );

        $this->s3 = Aws::factory($aws)->get('s3');

    }

    public function registerStreamWrapper() {
        $this->s3->registerStreamWrapper();
    }

}

添加参数:aws_key, aws_secret_key, aws_regioninparameters.yml

覆盖boot()方法在AppKernel.php

public function boot() {
    parent::boot();
    $s3client = new \Path\to\Amazon\StreamWrapperS3($this->container->getParameter('aws_key'), $this->container->getParameter('aws_secret_key'), $this->container->getParameter('aws_region'));
    $s3client->registerStreamWrapper();
}

config_prod.yml添加:

framework:
    templating:
        assets_base_url: https://sa-east-1.amazonaws.com/your-bucket-name
assetic:
    write_to: 's3://your-bucket-name'

最后将过滤器与您的资产一起添加以正确重写您的路径:

{% stylesheets filter='cssrewrite'
    'bundles/...' %}
    <link rel="stylesheet" href="{{ asset(asset_url) }}" /> {# asset just to be sure that url will be right #}
{% endstylesheets %}

因此,每次您更改某些内容时都需要运行:

php app/console cache:clear --env=prod
php app/console assets:install s3://<your-bucket-name> --env=prod
php app/console assetic:dump --env=prod

一个非常重要的细节花了我将近 2 天的时间,您需要更新 Amazon S3 的 CORS 以访问一些文件,例如在 twitter bootstrap css 中添加的字体。我的 CORS 权限是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
于 2014-10-01T16:59:15.123 回答