Artikel singkat yang bertujuan untuk menghindari pengikatan aplikasi Symfony2 ke suatu lingkungan dan malah mengubah konfigurasi berdasarkan lingkungan.
Untuk mengambil keputusan, seseorang dapat dengan mudah mengakses parameter env dari dalam aplikasi. Untuk mengilustrasikan dengan jelas apa yang terjadi, berikut adalah contoh kasar untuk mendapatkan lingkungan internal dari container di pengontrol dan menggunakannya untuk memutuskan apakah akan benar-benar mengirim peringatan SMS:
if ($this->container->getParameter('kernel.environment') == 'prod') {
$this->sendSms();
}
Kita dapat mengatasi masalah ini dengan memindahkan pengiriman SMS ke layanan dan memasukkan nilai parameter ke dalamnya:
namespace Acme\DemoBundle\Sms\Sender;
class Sender
{
private $env
public function __construct($env)
{
$this->env = $env;
}
public function send($number, $message)
{
if($this->env != 'prod') {
return;
}
// ...
}
}
Dengan definisi layanan ini:
%kernel.environment%
Namun, meskipun merupakan ide bagus untuk memindahkan pengiriman SMS dari pengontrol, kami masih menggabungkan layanan tersebut dengan lingkungan.
Mengapa ini buruk secara teori
Aplikasi tidak boleh mengetahui lingkungan apa yang dijalankannya, aplikasi hanya boleh dikonfigurasi dengan cara tertentu berdasarkan file konfigurasinya. Karena kita ingin mengubah konfigurasi antar lingkungan yang berbeda, setiap lingkungan biasanya memiliki konfigurasi yang berbeda. Kami memilih set konfigurasi mana yang akan dimuat, daripada memberi tahu aplikasi di lingkungan apa aplikasi tersebut berada.
Mengapa hal ini buruk dalam praktiknya
Secara teori semuanya baik dan bagus, tetapi apa masalahnya jika kita membiarkan aplikasi mengetahui lingkungannya dalam praktik? Pertama, sekarang kita hanya dapat mengubah konfigurasi dalam kode jika kita berubah pikiran tentang pengaturannya. Yang kedua adalah kita tidak bisa lagi menguji pengaturan dengan mengubah konfigurasi, kita perlu mengubah sepenuhnya lingkungan tempat aplikasi berjalan untuk melihat efeknya, jika kita menggunakan nilai konfigurasi, kita hanya perlu mengubah lingkungan saat ini.
Jika nanti Anda perlu menambahkan lingkungan tambahan yang memerlukan perubahan yang sama, Anda perlu menambahkan pernyataan if ke kode Anda untuk melakukan hal ini. Menggunakan nilai konfigurasi, jika Anda memerlukan nilai yang berbeda dari konfigurasi default, Anda cukup mengaturnya untuk lingkungan tersebut.
Dengan nama parameter yang bagus, tujuannya jelas, sehingga konfigurasi ulang aplikasi menjadi mudah tanpa harus menggali kode aplikasi untuk melihat kegunaan parameter tersebut.
namespace Acme\DemoBundle\Sms\Sender;
class SmsSender
{
private $sendingDisabled
public function __construct($sendingDisabled)
{
$this->sendingDisabled = $sendingDisabled;
}
public function send($number, $message)
{
if($this->sendingDisabled) {
return;
}
// ...
}
}
Dengan definisi layanan ini:
%acme.sms.disabled%
Dan di file config_dev.yml:
parameters:
acme.sms.disabled: true
Seperti yang saya lihat di postingan saya sebelumnya, Anda dapat mengeksposnya sebagai konfigurasi bundel alih-alih menjadikannya sebagai parameter.