Latte: Tip Sistemi Nasıl Kullanılır?

5 yıl önce Yazan David Grudl  

Tip sistemi. Sağlam uygulamalar geliştirmek için anahtar bir konu; PHP'nin Python, Ruby veya JavaScript gibi dinamik dillerin önüne geçtiği bir alan. Nette Framework, başlangıçtan beri programcıları tipli ve katı programlamaya yönlendirmiştir. Latte 2.7, şablonlara da tip desteği getirmiştir.

Her değişkende hangi veri veya nesne tipinin olduğunu bildiğimiz için:

  • IDE doğru şekilde ipucu verebilir
  • statik analiz hataları ortaya çıkarabilir

Geliştirme kalitesini ve rahatlığını önemli ölçüde artıran iki nokta.

PHP tarafında tipler nasıl bildirilir?

Verileri şablona, tüm değişkenleri ve tiplerini tanımlayan bir sınıfın nesnesi olarak ileteceğiz. PHP 7.4'ün yeni özelliklerini kullanarak şöyle görünebilir:

class MailTemplate
{
	public string $lang = 'cs';
	public Address $address;
	public string $subject;
	public ?float $price = null;
}

Kullanım:

$template = new MailTemplate;
$template->price = $this->getPrice();
...
$latte->render('mail.latte', $template);

Ek: PHP 8'in yeni özellikleri sayesinde örnek daha da ilginç bir şekilde şöyle yazılabilir:

class MailTemplate
{
	public function __construct(
		public string $lang = 'cs',
		public Address $address,
		public string $subject,
		public ?float $price = null,
	) {}
}

$latte->render('mail.latte', new MailTemplate(
	lang: $this->lang,
	subject: $title,
	price: $this->getPrice(),
	address: $userAddress,
));

Şablonda tipler nasıl bildirilir?

Belirtilen sınıfı şimdi şablonla birleştirebiliriz. Başlangıçta belirtmek yeterlidir:

{templateType MailTemplate}

Ve böylece şablonda $lang, $address, $subject ve $price değişkenlerinin dörtlüsünün ilgili tiplerle birlikte bulunacağını tanımladık.

Alternatif olarak, her değişkenin tipini doğrudan şablonda tanımlayabiliriz, yani sınıf oluşturmadan. Bunun için {varType} etiketi kullanılır:

{varType string $lang}
{varType Address $address}

Elbette her ikisi de birleştirilebilir. Presenter tarafında ipucu vermeyi sağlamak için bir sınıf oluşturun, {templateType} ile şablonla bağlayın ve bloklardaki diğer yerel değişkenler vb. için {varType} kullanın. Bunu, PHP kodunda bazen IDE'ye veya statik analizöre talimat vermek için kullandığımız /** @var type $variable */ yorumunun bir benzeri olarak düşünebiliriz.

Yeni olarak, tip {var}, {default} veya {define} etiketlerinde de belirtilebilir:

{var Model\Page $page = $items['page']}
{define form, string $name}
	...
{/define}

Not: Tarihsel nedenlerden dolayı, {var} ve {default} etiketlerinde değişkenleri başlangıç dolar işareti olmadan (ve eşittir yerine ok ile) yazmak mümkündü. Bu, bunun bir tip mi yoksa değişken mi olduğu konusunda belirsizlik yarattığından, bu sözdizimi yasaklanmıştır ve Latte bunu kullandığınızda sizi uyaracaktır. Şablonlarınızda bu eski yazımın olup olmadığını aramanın basit bir yolu, /\{(var|default) [^$]/ ve /\{(var|default) [^}]*=>/ düzenli ifadelerini aramaktır.

İşten nasıl tasarruf edilir?

Şablon sınıfını veya {varType} etiketlerini en kolay nasıl yazabiliriz? Onları oluşturun. İşte bunun için {templatePrint} ve {varPrint} etiket çifti vardır.

Bu etiketlerden birini şablona yerleştirirseniz, normal oluşturma yerine sınıf kodunun bir taslağı veya {varPrint} etiketlerinin bir listesi görüntülenir. Ardından kodu tek bir tıklamayla işaretleyip projeye kopyalamak yeterlidir.

nette/application 3.1'in (beta sürümünde) bir parçası, presenter'lar için daha uygun kod üreten aşırı yüklenmiş bir {templatePrint} etiketidir.

{varPrint} etiketi, şablon parametreleri olmayan yerel değişkenleri listeler. Tüm değişkenleri listelemek istiyorsanız, {varPrint all} kullanın.

IDE'de İpucu Verme

PhpStorm için Latte eklentisinin en son sürümü yukarıdaki etiketleri kullanabilir ve ardından tiplere göre ipucu verebilir. Eklenti aynı zamanda $user, $presenter, $basePath vb. gibi standart değişkenlerin tiplerini de bilir.

Statik Analiz

Amaç, bildirilen tüm tiplerin statik analiz için de kullanılabilmesidir. Örneğin, PHPStan kullanarak şablonları diğer PHP dosyaları kadar kolay bir şekilde kontrol edebilmek.

Bunun üzerinde çalışıyoruz ve Latte'nin gelecek sürümlerinden birinde göreceksiniz.