Symfony Flex’i kullanarak Symfony Uygulamalarını Yönetmek

Ömer Büyükçelik
Ankara PHP
Published in
3 min readJul 25, 2017

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 mailer

Bu 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 true

Kendi 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-project

Symfony 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:

  1. Yeni bir boş symfony uygulaması oluşturun (composer create-project symfony/skeleton my-project-flex)
  2. Yeni projenin composer.json dosyasına orijinal projenincomposer.jsondosyasında tanımlanmış require ve require-dev bağımlılıklarını kopyalayın.
  3. 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.
  4. Oluşturulan config/packages/*.yaml dosyalarını gözden geçirin ve orijinal projenizin app/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.
  5. İhtiyaçlarınıza göre app/config/parameters.*.yml’de tanımlanan özgün parametreleri yeni config/services.yaml ve .env dosyalarına taşıyın.
  6. Orjinal kaynak kodunuzu src/{App,...}Bundle/ klasrönden her namespace’i güncelleyerek src/ klasörü altına taşıyın.
  7. Orijinal şablonları(templates) app/Resources/views/adresinden templates/taşıyın
  8. Uygulamanız tarafından gereken diğer değişiklikleri yapın. Örneğin, orijinal web/app_*.php front controllers özelleştirilmişse, bu değişiklikleri yeni public/index.php denetleyicisine ekleyin.

--

--