<?php
namespace App\EventListener;
use Aws\S3\S3Client;
use Pimcore\Event\AssetEvents;
use Pimcore\Event\Model\AssetEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class AssetEventListener implements EventSubscriberInterface
{
/**
* @var S3Client
*/
private $s3Client;
/**
* @var string
*/
private $s3TmpUrlPrefix;
private $s3BaseUrl;
/**
* @var string
*/
private $s3AssetUrlPrefix;
/**
* @var Pimcore\Model\Asset
*/
private $asset;
public function __construct()
{
$this->s3BaseUrl = S3_ASSET_URL_PIMCORE;
$this->s3TmpUrlPrefix = $this->s3BaseUrl . str_replace('s3:/', '', PIMCORE_TEMPORARY_DIRECTORY);
$this->s3AssetUrlPrefix = $this->s3BaseUrl . str_replace('s3:/', '', PIMCORE_ASSET_DIRECTORY);
$this->s3Client = $this->getS3Client();
}
/**
* @inheritDoc
*/
public static function getSubscribedEvents()
{
return [
AssetEvents::POST_ADD => 'onPostAdd',
AssetEvents::POST_UPDATE => 'onPostUpdate',
];
}
/**
* Create a new s3 client object
*
* @return S3Client
*/
protected function getS3Client()
{
$s3ConfigSettings = [
'version' => 'latest',
'region' => AMAZON_S3_REGION,
'credentials' => [
'key' => AMAZON_S3_KEY,
'secret' => AMAZON_S3_SECRET
],
];
return new S3Client($s3ConfigSettings);
}
public function onPostAdd(AssetEvent $event)
{
$this->asset = $event->getAsset();
if ($this->asset->getType() == 'folder') {
return false;
}
$key = $this->asset->getRealFullPath();
$this->makeAssetPublicInS3('assets'.$key);
}
public function onPostUpdate(AssetEvent $event)
{
$this->asset = $event->getAsset();
if ($this->asset->getType() == 'folder') {
return false;
}
$key = $this->asset->getRealFullPath();
$this->makeAssetPublicInS3('assets'.$key);
}
/**
* Make s3 bucket asset publicly available
*
* @param $assetPath
* @param bool $isTmp
*/
protected function makeAssetPublicInS3($assetPath, $isTmp = false)
{
$this->s3Client->putObjectAcl([
'ACL' => 'public-read-write',
'Grants' => [
[
'Grantee' => [
'DisplayName' => 'public-read-write',
'EmailAddress' => 'fyzalam@gmail.com',
'Type' => 'CanonicalUser'],
'Permission' => 'READ',
],
],
'Owner' => ['DisplayName' => AMAZON_S3_BUCKET, ],
'Bucket' => AMAZON_S3_BUCKET,
'Key' => $assetPath,
'RequestPayer' => AMAZON_S3_BUCKET,
]);
if ($isTmp === false) {
$this->asset->update(true);
}
}
}