php 应用程序/控制台资产:使用流 Package 器错误安装到S3

pnwntuvh  于 2023-02-28  发布在  PHP
关注(0)|答案(2)|浏览(79)

我配置了一个流 Package 器,使用Gaufrette bundle管理文件系统,可以使用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"

我可以执行app/console assetic:dump--env = dev,然后它会成功地将资产上传到我的s3 bucket,但是当我尝试通过执行以下操作来执行资产安装时:

app/console assets:install s3://amazon

它给我这个错误:

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

我在网上看过,有人可以做到他所描述的here。我的蒸汽 Package 有什么问题?

q3qa4bjr

q3qa4bjr1#

是否确实已注册任何流 Package 来处理“s3://”方案?
在www.example.com中https://github.com/Cybernox/AmazonWebServicesBundle/blob/master/Resources/doc/cdn.md#dump-assets-to-the-s3-bucket,您将看到他们如何注册流 Package 器,以便能够将资产转储到“s3://”目标。

ui7jx7zq

ui7jx7zq2#

所以我所做的一切都奏效了。
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();
    }

}

添加参数:在parameters.yml中的aws_keyaws_secret_keyaws_region
AppKernel.php处重写boot()方法:

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天的时间,你需要更新亚马逊S3的CORS访问一些文件作为字体添加到twitter引导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>

相关问题