Symfony Flex’i kullanarak Symfony Uygulamalarını Yönetmek
Symfony Flex, Symfony uygulamalarını kurmanın ve yönetmenin yeni yoludur. Flex, yeni bir Symfony sürümü değildir, Symfony Installer’ı değiştiren ve geliştiren bir araçtır.
Symfony Flex, bundle’ları ve diğer bağımlılıkları kurma ve kaldırma gibi Symfony uygulamalarının en yaygın görevlerini otomatikleştirir. Symfony Flex, Symfony 3.3 ve daha yeni sürümleri için çalışır. Symfony 4.0'dan başlayarak Flex varsayılan olarak kullanılacaktır, ancak kullanımı yine de isteğe bağlı olacaktır.
Flex Nasıl Çalışır
Symfony Flex, require ve update komutlarının davranışını değiştiren bir Composer eklentisidir. Flex özellikli bir uygulamaya bağımlılık yüklerken veya güncellerken Symfony Flex, Composer çalışmasından önce ve sonra çalışır.
Aşağıdaki örneği inceleyelim:
$ cd my-project/
$ composer require mailerBu komutu Flex kullanmayan bir Symfony uygulamasında çalıştırırsanız, mailer in geçerli bir paket adı olmadığını açıklayan bir Composer hatası görürsünüz ancak eğer Symfony Flex’i yüklü ise bu komut Symfony uygulamaları için resmi mailer olan Swiftmailer’i bütünleştirmenin en iyi yolu olan SwiftmailerBundle’ı kurup etkinleştirir.
Symfony Flex ile uygulamaya yüklendiğinde ve composer require ile uygulama Composer ile paketi kurmaya başlamadan önce Symfony Flex sunucularına bir istekte bulunur:
- Paket hakkında hiçbir bilgi yoksa, Flex sunucusu hiçbir şey döndürmez ve paket yüklemesi Composer temelli olağan prosedürü izler;
- Paketle ilgili özel bilgiler varsa Flex bunu “recipe” adlı bir dosyaya döndürür ve uygulama hangi paketin yükleneceğine ve yükleme sonrasında hangi otomatik görevlerin çalıştırılacağına karar vermek için kullanır.
Yukarıdaki örnekte, Symfony Flex mailer paketini sorar ve Symfony Flex sunucusu mailer’in aslında SwiftmailerBundle için bir takma ad olduğunu algılar ve bunun için “recipe” döndürür.
Symfony Flex Recipes(Tarifler)
Tarifler manifest.jsondosyasında tanımlanır ve istediğiniz sayıda başka dosya ve dizini içerebilir. Örneğin, SwiftmailerBundle için manifest.json:
{
"bundles": {
"Symfony\\Bundle\\SwiftmailerBundle\\SwiftmailerBundle": ["all"]
},
"copy-from-recipe": {
"config/": "%CONFIG_DIR%/"
},
"env": {
"MAILER_URL": "smtp://localhost:25?encryption=&auth_mode="
},
"aliases": ["mailer", "mail"]
}Takma ad seçeneği Flex’in kısa ve anlaşılması kolay isimleri kullanarak paketleri yüklemesine olanarak tanır. (composer require mailer vs composer require symfony/swiftmailer-bundle). bundles seçeneği Flex’a hangi ortamların otomatik olarak etkinleştirileceğini Flex’a bildirir. env seçeneği Flex’i uygulamaya yeni çevre değişkenleri eklemeye zorlar copy-from-recipe taramanın dosyaları ve dizinleri uygulamanıza kopyalamasına izin verir.
Bu manifest.json dosyasında tanımlanan talimatlar, Symfony Flex tarafından tüm değişiklikleri geri almak için bağımlılıkları kaldırırken (ör. composer remove mailer) kullanılır. Bu, Flex’in SwiftmailerBundle’ı uygulamadan kaldıracağı veMAILER_URL çevre değişkeninin ve bu tarif tarafından oluşturulan diğer tüm dosyaları ve dizini silebileceği anlamına gelir.
Symfony Flex tarifleri topluluk tarafından sağlanır ve iki ortak depoda saklanır:
- Ana tarif deposu(Main recipe repository), kaliteli ve bakımlı(maintained) paketler için hazırlanmış tariflerin bir listesi. Symfony Flex sadece varsayılan olarak bu havuza bakar.
- Topluluk tarif deposu(Contrib recipe repository), topluluk tarafından oluşturulan tüm tarifleri içerir. Hepsinin çalışması garanti edilir, ancak ilişkili paketleri düzenlenemez. Symfony Flex bu tarifleri varsayılan olarak yoksayar, ancak projenizde bunları kullanmaya başlamak için bu komutu çalıştırabilirsiniz:
$ cd your-project/
$ composer config extra.symfony.allow-contrib trueKendi paketleriniz için nasıl tarif oluşturulacağı ilgili her şeyi öğrenmek için Symfony Tarifler belgelerini okuyun.
Yeni Uygulamalar’da Symfony Flex’i Kullanma
Symfony, yeni uygulamalar oluşturmak için önerilen minimal bir Symfony projesi olan yeni bir “skeleton” projesi yayınladı.
$ composer create-project symfony/skeleton my-projectSymfony 3.3'den beri yeni uygulamalar oluşturmak için Symfony Installer’ın kullanımı artık önerilmez bunun yerine, Composer create-project komutu kullanın.
Varolan Uygulamaları Flex’a Yükseltme
Symfony Flex’i kullanmak opsiyoneldir. Flex’in varsayılan olarak kullanılacağı Symfony 4'de bile isteğe bağlıdır ancak verimliliğinizi arttırmak için şiddetle mevcut uygulamalarınızı yükseltmek tavsiye edilir.
your-project/
├── Makefile
├── config/
│ ├── bundles.php
│ ├── packages/
│ ├── routes.yaml
│ └── services.yaml
├── public/
│ └── index.php
├── src/
│ ├── ...
│ └── Kernel.php
├── templates/
└── vendor/Bu uygulamanıza symfony/flex bağımlılığının yüklenmesinin yeterli olmadığı anlamına gelir. Ayrıca dizin yapısını yukarıda gösterilen dizine yükseltmelisiniz bu yükseltmeyi yapmak için otomatik bir araç mevcut değildir bu nedenle alttaki manuel adımları izlemelisiniz:
- Yeni bir boş symfony uygulaması oluşturun (composer create-project symfony/skeleton my-project-flex)
- Yeni projenin
composer.jsondosyasına orijinal projenincomposer.jsondosyasında tanımlanmışrequireverequire-devbağımlılıklarını kopyalayın. - Yeni projenizde
composer installçalıştırarak bağımlılıkları yükleyin. Bu Symfony Flex’in ayar dosyalarınıconfig/packages/altında oluşturmasını sağlayacaktır. - Oluşturulan
config/packages/*.yamldosyalarını gözden geçirin ve orijinal projenizinapp/config/config_*.ymldosyasında tanımlanan yapılandırmaya göre gerekli değişiklikleri yapın. Bunun, yükseltme işleminin en çok zaman alan ve hata oluşan adım olduğundan dikkat edin. - İhtiyaçlarınıza göre
app/config/parameters.*.yml’de tanımlanan özgün parametreleri yeniconfig/services.yamlve.envdosyalarına taşıyın. - Orjinal kaynak kodunuzu
src/{App,...}Bundle/klasrönden her namespace’i güncelleyereksrc/klasörü altına taşıyın. - Orijinal şablonları(templates)
app/Resources/views/adresindentemplates/taşıyın - Uygulamanız tarafından gereken diğer değişiklikleri yapın. Örneğin, orijinal
web/app_*.phpfront controllers özelleştirilmişse, bu değişiklikleri yenipublic/index.phpdenetleyicisine ekleyin.

