23/06/2018 - SYMFONY
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.
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);
}
}
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()));
}
}
}
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.');
}
}
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}'
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'
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%'
Bu sahte classı işaret ediyor.
parameters:
aws_ses_util_class: 'App\Tests\Mock\AwsSesUtilMock'
Bu sahte classı işaret ediyor.
parameters:
aws_ses_util_class: 'App\Tests\Mock\AwsSesUtilMock'
Bu gerçek classı işaret ediyor.
parameters:
aws_ses_util_class: 'App\Util\Aws\AwsSesUtil'
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.