() translation by (you can also view the original English article)



Yii2 ile Nasıl Uygulama Yazılır: Genel Bakış eğitiminde, yerel makinamıza Yii2' yi kurup bir Merhaba Dünya uygulaması geliştirdik, ardından uzak sunucu ortamımızı ayarladık ve Github'ı kodumuzu dağıtmak için kullandık. Bu eğitimde Yii' nin, MVC Framework ile uygulama geliştirmede daha temel kavramları olan Model, View ve Controller yapısını ele alacağız. Menü ve Bootstrap (CSS kütüphanesi) öğelerinin yerleşim planlarını ve özelleştirmelerini de inceleyeceğiz.
Örneklerde, basit durum güncelleştirmeleri yayınlamak için bir framework geliştirdiğimizi farz ediyoruz, ör. kendi mini Twitter uygulamamızı. Fakat, verileri veritabanında saklayacak kadar ileri gitmeyeceğiz. Bunu, Yii' nin model ve view katmanlarını oluşturan Gii adlı yeteneğini inceleyeceğimiz bir sonraki derse saklıyorum.
Gii, bu eğitimde yapacağımız herşeyi basitleştirip otomatikleştiriyor fakat temel kavramların üzerinden geçmek ve bu görevleri en az birkez manuel yerine getirmek önemlidir.
Modeller
Model nedir? Wikipedia' da söylenilen, "Model, durumunda bir değişiklik olduğunda ilgili View ve Controller' ları bilgilendirir. Bu bildirim, view' lerin güncellenmiş çıktılar üretmesine, controller' ların da komut setlerini değiştirmesine olanak tanır"
Benim için, model' ler genellikle "dış" dünyada oluşturduğum şeyin kavramlarını temsil eder. Durum güncelleştirmelerini düşünürsek, Status modeli bir durum güncelleştirmesinin tüm özelliklerini, bir durumu yada durumları sorgulamayla veya değiştirmeyle ilgili tüm işlemleri ve yöntemleri içerir.
Modellerinizi oluşturmada en iyi yöntem, onlara olabildiğince fonksiyonellik ve zeka katmaktır. MVC pratiğinde, modelleri "ağır", controller ve view' leri hafif görevlerden oluşturursunuz. Yii, özellikle formlar ve veritabanları söz konusu olduğunda, model oluşturma işlemini basitleştiren, web ve uygulama geliştirmede yaptığınız şeylere özgü bazı mükemmel özellikler sunar; Bunların çoğunu daha sonraki eğitimlerimizde inceleyeceğiz.
Status modelimizi oluşturalım. Kod örneklerimiz için Git deposunu kullanabilirsiniz. Ben Genel Bakış eğitiminde yarattıklarımı temel alıyorum - referans olması açısından linkini veriyorum. Bahsedilen eğitimdeki Github deposunun bitmiş hali burada.
Status.php yi /hello/models/Status.php
dizininde oluşturacağız. Durum mesajı göndermek için, mesaj metnini kullanıcıdan almamız gerekir. Ayrıca genele açık veya gizli olarak yayınlamak için izin alanları da oluşturacağız.
1 |
<?php
|
2 |
|
3 |
namespace app\models; |
4 |
|
5 |
use yii\base\Model; |
6 |
|
7 |
class Status extends Model |
8 |
{
|
9 |
const PERMISSIONS_PRIVATE = 10; |
10 |
const PERMISSIONS_PUBLIC = 20; |
11 |
|
12 |
public $text; |
13 |
public $permissions; |
14 |
|
15 |
public function rules() |
16 |
{
|
17 |
return [ |
18 |
[['text','permissions'], 'required'], |
19 |
];
|
20 |
}
|
21 |
|
22 |
public function getPermissions() { |
23 |
return array (self::PERMISSIONS_PRIVATE=>'Private',self::PERMISSIONS_PUBLIC=>'Public'); |
24 |
}
|
25 |
|
26 |
public function getPermissionsLabel($permissions) { |
27 |
if ($permissions==self::PERMISSIONS_PUBLIC) { |
28 |
return 'Public'; |
29 |
} else { |
30 |
return 'Private'; |
31 |
}
|
32 |
}
|
33 |
}
|
34 |
?>
|
Rules fonksiyonuna dikkat edin - kullanıcıların her alana uygun bilgileri girmesini sağlamak adına Yii' nin form doğrulaması kullanılıyor. Yii kullanıcı girdileri gibi form kontrollerinde JavaScript kullanır.
Benim yarattığım getPermissions()
fonksiyonu, formun açılır-kapanır (dropdown) liste elemanları için kullanılacak.
Şimdi, kullanıcının metin güncellemelerini oluşturmasına ve görüntülemesine izin veren controller' ı oluşturarak yolumuza devam edelim.
Controllerlar
Controller nedir? Wikipedia' da söylenilen "Controller, modelin durumunu güncelleştirmek için modele komutlar gönderebilir (ör. bir belgeyi düzenlerken). Aynı zamanda, ilgili view' e model' in view katmanına ait görünümü değiştirmesi için de komutlar gönderebilir." Tipik bir Yii web uygulamasında, bir sayfanın URL adresi, modeli kullanarak sayfa verilerini yüklemede ve view' i kullanarak sayfanın görüntüsünü oluşturmada bir controller' ı çalıştırır.
İlgili fonksiyonları mantıksal olarak tek bir controller' da gruplamak en iyisidir. Eylem (action) olarak adlandırılan, controller' ın farklı metodları her bir fonksiyonu yerine getirir. Bunlar genellikle belirli sayfalara karşılık gelir. Örneğin, http://localhost:8888/hello/web/status/create adresi oluşturacağımız StatusController' unun create eylemini tetikler.
Status ile ilgili özellikleri geliştirirken, bu fonksiyonları tek bir StatusController.php dosyasında gruplayacaksınız. Şimdilik, yalnızca bir create fonksiyonu oluşturacağız.
/hello/controllers/
dizininde, StatusController.php isimli dosyayı oluşturun:
1 |
<?php
|
2 |
|
3 |
namespace app\controllers; |
4 |
|
5 |
use Yii; |
6 |
use yii\web\Controller; |
7 |
use app\models\Status; |
8 |
|
9 |
class StatusController extends Controller |
10 |
{
|
11 |
public function actionCreate() |
12 |
{
|
13 |
$model = new Status; |
14 |
|
15 |
if ($model->load(Yii::$app->request->post()) && $model->validate()) { |
16 |
// valid data received in $model
|
17 |
return $this->render('view', ['model' => $model]); |
18 |
} else { |
19 |
// either the page is initially displayed or there is some validation error
|
20 |
return $this->render('create', ['model' => $model]); |
21 |
}
|
22 |
}
|
23 |
}
|
24 |
?>
|
Form oluşturma eylemleri tipik olarak model verilerini çağırır ve ardından POST işleminin bir parçası olup olmamalarına bağlı olarak bir kopyasını oluşturur. Değilse, boş bir form görüntülenir. Gönderilen veriler alınıyorsa, doğrulanmış vede işlenmiştir. Bizim durumumuzda bu, view dosyasını oluşturmaya devam etmek demektir.
Viewler
View nedir? Wikipedia, "View, son kullanıcının etkileşimde olduğu sunum katmanını oluşturmada model' den bilgi talep eden." diye tarif ediyor. Yii' de view, sayfanın çıktısını HTML' e dönüştürmede PHP benzeri bir şablon dilinden yararlanır ve model tarafından yüklenen ve controller' dan gelen verileri kullanır.
View' ler tipik olarak ilgili controller' la bağlantılı tek bir dizinde yer alırlar, ör. StatusController' a ait view' ler views/status
klasöründe yer alır.
Yii' de, kısmi / parçalı görünüm olarak adlandırılan şeylere genellikle form kodu dahildir. Bu dosyalar çoğunlukla alt çizgi öneki ile adlandırılır. Bunların başka view' lere dahil edilmesi amaçlanmıştır. Bu, güncel form kodunun sayfa oluşturmada ve güncellemede yeniden kullanılmasını sağlar.
İlk olarak, formu oluşturan Create view' ini geliştireceğiz. Ardından, gönderdiğimiz durum değişikliklerini gösteren bir View' de oluşturacağız. Gelecek eğitimlerde bu, veritabanı ile çalışırken, veriyi kaydetmede ve getirmede biraz farklı çalışacaktır.
İşte basit bir örnek, yayınlanan verileri görüntüleyen /hello/views/status.view.php
isimli view dosyası:
1 |
<?php
|
2 |
use yii\helpers\Html; |
3 |
?>
|
4 |
|
5 |
<h1>Your Status Update</strong></h1> |
6 |
<p><label>Text</label>:</p> |
7 |
<?= Html::encode($model->text) ?> |
8 |
<br /><br /> |
9 |
<p><label>Permissions</label>:</p> |
10 |
<?php
|
11 |
echo $model->getPermissionsLabel($model->permissions); |
12 |
?>
|
Bir view dosyasının HTML ve PHP kodlarının bir karışımı olduğuna dikkat edin. Controller gönderilen verileri aldığında, kullanıcının gönderdiği verileri gösteren yukarıdaki view'i işleme alır.
Şimdi de formlardan bahsedelim ve form view dosyasını oluşturalım.
Formlar
Formlar, web uygulaması geliştirirken, kullanıcıdan veri toplamada hergün kullandığımız şeylerdendir ve genellikle kullanıcı girdisini veritabanına göndermede kullanılır. Yii, formlar aracılığıyla veri girişi, güvenlik, doğrulama ve gönderim işlemini basitleştirmek için oldukça fazla yardımcı kod sunar. Yii' de formlar bir tür view' dir.



Durum güncelleştirmesi oluşturmak için bir form örneği:
1 |
<?php
|
2 |
use yii\helpers\Html; |
3 |
use yii\widgets\ActiveForm; |
4 |
use app\models\Status; |
5 |
?>
|
6 |
<?php $form = ActiveForm::begin();?> |
7 |
<?= $form->field($model, 'text')->textArea(['rows' => '4'])->label('Status Update'); ?> |
8 |
|
9 |
<?=
|
10 |
$form->field($model, 'permissions')->dropDownList($model->getPermissions(), |
11 |
['prompt'=>'- Choose Your Permissions -']) ?> |
12 |
|
13 |
<div class="form-group"> |
14 |
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?> |
15 |
</div>
|
16 |
|
17 |
<?php ActiveForm::end(); ?> |
Yii2 Widget sınıfından türeyen ActiveForm sınıfını HTML giriş alanlarımızı oluşturmada kullandık. Status modelinin getPermissions
metodu açılır-kapanır (drop-down) liste tarafından nasıl çağrılıyor dikkat edin.



Submit butonuna tıkladığınızda StatusController' un create eylemine (action) geri dönersiniz. Gönderilen veriler alındığında, form dosyası olan create.php yerine view.php dosyası görüntülenir.
view.php dosyası görüntülendiğinde view dosyasının görünümü şöyledir:



Ardından, Status oluşturma formuna bağlantılar (link) eklemek için genel menü çubuğunu güncelleyelim.
Yerleşim Planları (Layouts)
Yerleşim planları (layouts), HTML belgesini çevreleyen, üst bilgi (header), alt bilgi (footer) ve menü gibi bir web sitesinde tekrarlanan öğelerin çoğunun şablonudur. Bunlar bir web sitesinin çoğu sayfasında ortak olduğu için, yerleşim planında bir kere inşa edilir ve kodun her yerinde tekrar edilmezler.
\hello\views\layouts\main.php
dosyasına göz atarsanız, yerleşim planının yapısını görebilirsiniz.
1 |
<?php
|
2 |
use yii\helpers\Html; |
3 |
use yii\bootstrap\Nav; |
4 |
use yii\bootstrap\NavBar; |
5 |
use yii\widgets\Breadcrumbs; |
6 |
use app\assets\AppAsset; |
7 |
|
8 |
/* @var $this \yii\web\View */
|
9 |
/* @var $content string */
|
10 |
|
11 |
AppAsset::register($this); |
12 |
?>
|
13 |
<?php $this->beginPage() ?> |
14 |
<!DOCTYPE html>
|
15 |
<html lang="<?= Yii::$app->language ?>"> |
16 |
<head>
|
17 |
<meta charset="<?= Yii::$app->charset ?>"/> |
18 |
<meta name="viewport" content="width=device-width, initial-scale=1"> |
19 |
<?= Html::csrfMetaTags() ?> |
20 |
<title><?= Html::encode($this->title) ?></title> |
21 |
<?php $this->head() ?> |
22 |
</head>
|
23 |
<body>
|
24 |
|
25 |
<?php $this->beginBody() ?> |
26 |
<div class="wrap"> |
27 |
<?php
|
28 |
NavBar::begin([ |
29 |
'brandLabel' => 'My Company', |
30 |
'brandUrl' => Yii::$app->homeUrl, |
31 |
'options' => [ |
32 |
'class' => 'navbar-inverse navbar-fixed-top', |
33 |
],
|
34 |
]);
|
35 |
echo Nav::widget([ |
36 |
'options' => ['class' => 'navbar-nav navbar-right'], |
37 |
'items' => [ |
38 |
['label' => 'Home', 'url' => ['/site/index']], |
39 |
['label' => 'About', 'url' => ['/site/about']], |
40 |
['label' => 'Contact', 'url' => ['/site/contact']], |
41 |
Yii::$app->user->isGuest ? |
42 |
['label' => 'Login', 'url' => ['/site/login']] : |
43 |
['label' => 'Logout (' . Yii::$app->user->identity->username . ')', |
44 |
'url' => ['/site/logout'], |
45 |
'linkOptions' => ['data-method' => 'post']], |
46 |
],
|
47 |
]);
|
48 |
NavBar::end(); |
49 |
?>
|
50 |
|
51 |
<div class="container"> |
52 |
<?= Breadcrumbs::widget([ |
53 |
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], |
54 |
]) ?> |
55 |
<?= $content ?> |
56 |
</div>
|
57 |
</div>
|
58 |
|
59 |
<footer class="footer"> |
60 |
<div class="container"> |
61 |
<p class="pull-left">© My Company <?= date('Y') ?></p> |
62 |
<p class="pull-right"><?= Yii::powered() ?></p> |
63 |
</div>
|
64 |
</footer>
|
65 |
|
66 |
<?php $this->endBody() ?> |
67 |
</body>
|
68 |
</html>
|
69 |
<?php $this->endPage() ?> |
View' ler çoğunlukla bir web sayfasının gövdesini temsil eder - bu, üst bilgi ve menü ile alt bilginin başlangıcı arasında kalan kısımdır. Yerleşim planı $content
değişkenini echo (çıktıyı ekrana bastırma işlemi) ettiğinde oluşturulurlar:
1 |
<div class="container"> |
2 |
<?= Breadcrumbs::widget([ |
3 |
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], |
4 |
]) ?> |
5 |
<?= $content ?> |
6 |
</div>
|
Her zaman gerekli olmasa da Yii, uygulama başına birden fazla yerleşim planı oluşturmanıza imkan tanır. Uygulamanıza bağlı. Controller' lar varsayılan bir yerleşim planı sunar ve bunu herhangi bir eylem (action) için geçersiz kılabilirsiniz. Controller' larda ilgili etkinlikleri mantıksal olarak gruplarsanız, son kullanıcı arayüzünün controller' daki tüm eylemler için aynı yerleşim planını kullanması mümkün olur.
Şimdi, menü çubuğunu, bir "create" eylemi ile Status menüsünü içerecek şekilde güncelleyelim. Yii2 yerleşim planları ve stiller (stylesheet) için Bootstrap framework' ünü kullandığından, Bootstrap açılır-kapanır listesini oluşturmasını bildirmemiz yeterlidir.
İç içe geçmiş dizi yapısındaki Nav::widget
bloğunu güncelleyelim:
1 |
echo Nav::widget([ |
2 |
'options' => ['class' => 'navbar-nav navbar-right'], |
3 |
'items' => [ |
4 |
['label' => 'Home', 'url' => ['/site/index']], |
5 |
[
|
6 |
'label' => 'Status', |
7 |
'items' => [ |
8 |
['label' => 'Create', 'url' => ['/status/create']], |
9 |
],
|
10 |
],
|
11 |
['label' => 'About', 'url' => ['/site/about']], |
12 |
['label' => 'Contact', 'url' => ['/site/contact']], |
13 |
Yii::$app->user->isGuest ? |
14 |
['label' => 'Login', 'url' => ['/site/login']] : |
15 |
['label' => 'Logout (' . Yii::$app->user->identity->username . ')', |
16 |
'url' => ['/site/logout'], |
17 |
'linkOptions' => ['data-method' => 'post']], |
18 |
],
|
19 |
]);
|
Görmeniz gereken şey şöyle olmalı:



Sırada Ne Var?
Artık model, view, controller, form ve yerleşim planları da dahil olmak üzere, Yii' nin MVC mimarisinin pratikte nasıl çalıştığından birazda olsun haberdar olduğunuza göre, bütün bu herşeyi otomatik olarak oluşturan Yii' nin temel yapı oluşturucusu Gii' yi durumlar için bir veritabanı şeması oluşturmada kullanacağız. İşler biraz daha hızlı hareket etmeye başlayacak.
Bir sonraki Yii2 eğitiminden haberdar olmak istiyorsanız, @reifman twitter hesabımı yada yazar sayfamı takip edebilirsiniz. Yazar sayfamda bu seriye ait tüm eğitimler yayınlanır yayınlanmaz yer alıcak.