Popüler framework'lerin LTS versiyonlarını kullanabilirsiniz.
Symfony ve
Laravel'in LTS sürümleri en az 2 yıl boyunca güncelleme almaya devam ediyor.
Onun dışında araya katmanlar katarak framework'lerden olabildiğince bağımsız hale gelebilirsiniz. Kodunuzda tamamen kendi interface'leriniz ile konuşup, framework'lerin/kütüphanelerin kodlarını adapter'ler aracılığıyla kullanabilirsiniz.
Örneğin;
Veritabanına yazma işlemini direk olarak Doctrine'le konuşarak değilde, kendi Interface'iniz ile konuşup yaparsanız, ileride Doctrine yerine Eloquent vs. de kullansanız, yazmış olduğunuz kodları değiştirmenize gerek kalmadan, Eloquent için bir adapter yazarak halledebilirsiniz.
Örnek;
Sizin kullanacağınız depolama arayüzü, nasıl depolandığı sizi veya kodunuzu ilgilendirmiyor

.
<?php
namespace App\Contract;
/**
* Tüm depolama işlemleri bu arayüze göre yapılmalı.
*/
interface StorageInterface
{
/**
* Verilen değeri depolar.
*
* @param array $values saklanacak olan değerler. (key -> value form'unda)
* @return boolean
*/
public function store(array $values): bool;
}Kullanıyorken, depolama detayına odaklanmıyorsunuz;
<?php
namespace App\Service;
use App\Contract\StorageInterface;
class PostService
{
protected $storage;
public function __construct(StorageInterface $storage) {
$this->storage = $storage;
}
public function create(string $title, string $content): bool {
return $this->storage->store(array(
'title' => $title,
'content' => $content
));
}
}Business logic'ini yazdığınız kod, verilerin nerede saklandığıyla ilgilenmiyor, sadece saklanacağını biliyor. Tabi bunuda yazdığınız interface(kontrat) sayesinde biliyor.
Örnek olarak bir DoctrineAdapter'i;
<?php
namespace App\Adapter\Storage;
use App\Contract\Storage;
class DoctrineStorage implements StorageInterface
{
public function store(array $values): bool {
// verilen değerleri doctrine kullanarak veritabanına saklar.
}
}Toplamak gerekirse;
<?php
// bir controller vs. içinde
$storage = new DoctrineStorage();
$postService = new PostService($storage);
$postService->create('hello world', 'hello world');Özet olarak; Adapter'ler dışında, hiç bir 3. parti yazılımın interface'ini, object'ini vs. kullanmayarak, tamamen kendi interface'leriniz, sınıflarınız ile konuşarak, olabildiğince framework'lerden bağımsız hale gelebilirsiniz.
Edit: Kendi interface'lerinize ek olarak
PSR'ın interface'lerine göre kod yazarakda, frameworkler/kütüphaneler arası rahatlıkla geçiş yapabilirsiniz.
Logger,
Cache,
Request/Response