Bileşen Modeli
Nette'de önemli bir kavram bileşendir. Sayfalara görsel etkileşimli bileşenler ekleriz, formlar veya tüm öğeleri
de bileşenlerdir. Tüm bu bileşenlerin miras aldığı temel iki sınıf, nette/component-model
paketinin bir
parçasıdır ve bileşenlerin ağaç hiyerarşisini oluşturmaktan sorumludur.
Component
Nette\ComponentModel\Component,
tüm bileşenlerin ortak atasıdır. Bileşenin adını döndüren getName()
yöntemini ve ebeveynini döndüren
getParent()
yöntemini içerir. Her ikisi de setParent()
yöntemiyle ayarlanabilir – ilk parametre
ebeveyn, ikincisi bileşenin adıdır.
lookup (string $type): ?Component
Hiyerarşide yukarı doğru istenen sınıf veya arayüzün nesnesini arar. Örneğin,
$component->lookup(Nette\Application\UI\Presenter::class)
, bileşen ona birkaç seviye üzerinden bile bağlıysa
presenter'ı döndürür.
lookupPath (string $type): ?string
Yol adı verilen, geçerli ve aranan bileşen arasındaki yoldaki tüm bileşenlerin adlarının birleştirilmesiyle oluşan
bir dize döndürür. Yani, örneğin $component->lookupPath(Nette\Application\UI\Presenter::class)
, bileşenin
presenter'a göre benzersiz tanımlayıcısını döndürür.
Container
Nette\ComponentModel\Container,
ebeveyn bileşendir, yani alt öğeleri içeren ve böylece bir ağaç yapısı oluşturan bir bileşendir. Nesneleri kolayca
eklemek, almak ve kaldırmak için yöntemlere sahiptir. Örneğin formun veya Control
ve Presenter
sınıflarının atasıdır.
getComponent (string $name): ?Component
Bileşeni döndürür. Tanımlanmamış bir alt öğeyi almaya çalışırken, createComponent($name)
fabrikası
çağrılır. createComponent($name)
yöntemi, geçerli bileşende createComponent<bileşen adı>
yöntemini çağırır ve parametre olarak bileşenin adını geçirir. Oluşturulan bileşen daha sonra geçerli bileşene alt
öğesi olarak eklenir. Bu yöntemlere bileşen fabrikaları diyoruz ve Container
sınıfının alt sınıfları
tarafından uygulanabilirler.
getComponents(): array
Doğrudan alt öğeleri bir dizi olarak döndürür. Anahtarlar bu bileşenlerin adlarını içerir. Not: 3.0.x sürümünde, yöntem bir dizi yerine bir yineleyici döndürüyordu ve ilk parametresi bileşenlerin derinlemesine taranıp taranmayacağını belirtiyordu ve ikincisi bir tür filtresi temsil ediyordu. Bu parametreler kullanımdan kaldırılmıştır.
getComponentTree(): array
Tüm iç içe geçmiş alt bileşenler dahil olmak üzere tüm bileşen hiyerarşisini dizinlenmiş bir dizi olarak alır. Arama önce derinlemesine yapılır.
Ataları İzleme
Nette bileşen modeli, ağaçla çok dinamik çalışmaya olanak tanır (bileşenleri kaldırabilir, taşıyabilir, ekleyebiliriz), bu nedenle bir bileşen oluşturulduktan sonra ebeveynin, ebeveynin ebeveyninin vb. hemen (kurucuda) bilindiğine güvenmek bir hata olur. Çoğu zaman, ebeveyn oluşturma sırasında hiç bilinmez.
Bir bileşenin presenter ağacına ne zaman bağlandığını nasıl anlarız? Ebeveyn değişikliğini izlemek yeterli
değildir, çünkü örneğin ebeveynin ebeveyni presenter'a bağlanmış olabilir. monitor($type, $attached,
$detached) yöntemi yardımcı olur. Her bileşen, herhangi bir sayıda sınıfı ve arayüzü izleyebilir. Bağlanma veya
ayrılma, $attached
veya $detached
geri çağrısının çağrılmasıyla ve izlenen sınıfın
nesnesinin geçirilmesiyle bildirilir.
Daha iyi anlamak için bir örnek: Nette Forms'daki dosya yükleme form öğesini temsil eden UploadControl
sınıfı, formun enctype
niteliğini multipart/form-data
değerine ayarlamalıdır. Ancak nesne
oluşturulduğunda herhangi bir forma bağlı olmayabilir. Öyleyse formu hangi noktada değiştirmeli? Çözüm basittir –
kurucuda izleme istenir:
class UploadControl extends Nette\Forms\Controls\BaseControl
{
public function __construct($label)
{
$this->monitor(Nette\Forms\Form::class, function ($form): void {
$form->setHtmlAttribute('enctype', 'multipart/form-data');
});
// ...
}
// ...
}
ve form kullanılabilir olduğunda, geri çağrı çağrılır. (Daha önce bunun yerine ortak attached
veya
detached
yöntemi kullanılıyordu).