Bazen farklı ortamlarda aynı parametre için farklı değerlerimiz olabilir. Bu örnek, Symfony 4 uygulamalarında çevreye özgü parametrelerin nasıl tanımlanacağını göstermektedir. prod ortamında e-posta göndermek için gerçek AWS SES classını kullanacağız, ancak dev ve test ortamlarında bunun yerine sahte olan classı kullanacağız.


AwsController


namespace App\Controller;

use App\Util\Aws\AwsSesUtil;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;

/**
* @Route("/aws")
*/
class AwsController
{
private $awsSesUtil;

public function __construct(AwsSesUtil $awsSesUtil)
{
$this->awsSesUtil = $awsSesUtil;
}

/**
* @Route("/ses")
* @Method({"GET"})
*/
public function send(): Response
{
$to = ['to@email.com'];
$from = 'from@email.com';
$subject = 'Test';
$body = 'This is a test';

$id = $this->awsSesUtil->sendEmail($to, $from, $subject, $body);

return new JsonResponse($id);
}
}

AwsSesUtil


Bu gerçek olanı.


namespace App\Util\Aws;

use App\Exception\AwsException;
use Aws\Result;
use Aws\Ses\Exception\SesException;
use Aws\Ses\SesClient;

class AwsSesUtil extends AwsAbstractUtil
{
private const CHARSET = 'UTF-8';

public function sendEmail(
iterable $toAddresses,
string $fromAddress,
string $subject,
string $body
): ?string {
try {
/** @var SesClient $client */
$client = $this->sdk->createSes();

/** @var Result $result */
$result = $client->sendEmail([
'Destination' => [
'ToAddresses' => $toAddresses,
],
'Source' => $fromAddress,
'Message' => [
'Subject' => [
'Charset' => self::CHARSET,
'Data' => $subject,
],
'Body' => [
'Text' => [
'Charset' => self::CHARSET,
'Data' => $body,
],
],
],
]);

return $result->get('MessageId');
} catch (SesException $e) {
throw new AwsException(sprintf('[AWS SES] %s', $e->getAwsErrorMessage()));
}
}
}

AwsSesUtilMock


Bu sahte olanı.


declare(strict_types=1);

namespace App\Tests\Mock;

use App\Util\Aws\AwsSesUtil;
use App\Exception\AwsException;

class AwsSesUtilMock extends AwsSesUtil
{
public function sendEmail(
iterable $toAddresses,
string $fromAddress,
string $subject,
string $body
): ?string {
if (
is_array($toAddresses) &&
$fromAddress &&
$subject &&
$body
) {
return 'MESSAGE_ID';
}

throw new AwsException('[AWS SES] Error while sending an email.');
}
}

Konfigürasyon dosyaları


config/services.yaml


imports:
- { resource: services/* }

parameters:

aws_sdk:
version: 'latest'
region: 'eu-west-1'
credentials:
key: 'AWS_KEY'
secret: 'AWS_SECRET'

services:
_defaults:
autowire: true
autoconfigure: true
public: false

App\:
resource: '../src/*'
exclude: '../src/{Controller,Util,Kernel.php}'

config/services/controllers.yaml


services:
_defaults:
autowire: true
autoconfigure: true
public: true

App\Controller\:
resource: '../../src/Controller'
tags: ['controller.service_arguments']

App\Controller\AwsController:
arguments:
- '@app.util.aws_ses_util'

config/services/utils.yaml


services:
_defaults:
autowire: true
autoconfigure: true
public: false

App\Util\:
resource: '../../src/Util'

Aws\Sdk:
arguments:
- '%aws_sdk%'

app.util.aws_ses_util:
class: '%aws_ses_util_class%'

config/packages/dev/parameters.yaml


Bu sahte classı işaret ediyor.


parameters:

aws_ses_util_class: 'App\Tests\Mock\AwsSesUtilMock'

config/packages/test/parameters.yaml


Bu sahte classı işaret ediyor.


parameters:

aws_ses_util_class: 'App\Tests\Mock\AwsSesUtilMock'

config/packages/prod/parameters.yaml


Bu gerçek classı işaret ediyor.


parameters:

aws_ses_util_class: 'App\Util\Aws\AwsSesUtil'

Test



Eğer APP_ENV değişkeninin değerini günceller ve http://localhost.dev/aws/ses'i çağırırsanız, dev ve test ortamları için yanıt olarak MESSAGE_ID yanıtını alırsınız. Eğer prod olarak değiştirirseniz, yanıt olarak 000201642d907400-0e7ea6ae-1111-2222-bc4c-e9039f4d15c5-333333 gibi gerçek bir yanıt alırsınız.