İşte endişeleri desen bir MVC / ayırma kullanarak PHP web siteleri oluştururken ben almak yaklaşım:
Kullandığım çerçeve üç temel parçalar vardır:
- Models - PHP Classes. I add methods to them to fetch and save data. Each
model represents a distinct type of entity in the system: users, pages,
blog posts
- Görüntüleme - Smarty şablonları. Html burada yaşıyor.
- Controllers - PHP classes. These are the brains of the application. Typically
urls in the site invoke methods of the class. example.com/user/show/1 would
invoke the $user_controller->show(1) method. The controller fetches data out
of the model and gives it to the view.
Bu parçaların her biri belirli bir işi ya da "endişe" vardır. model 'ın işi veri temiz bir arayüz sağlamak için. Genellikle sitenin verileri bir SQL veritabanında saklanır. Ben dışarı veri alma ve içeri verileri kaydetmek için modeline yöntemleri eklemek
view 'ın işi verileri görüntülemek için. Tüm HTML işaretleme görünümünde gider. Veri tablosu için zebra-şeritlemesi işlemek için Mantık görünümünde gider. Bir tarih görüntülenmesi gereken biçimi işlemek için kod görünümünde gider. Bu gibi şeyler işlemek için bazı güzel özellikler sunuyor çünkü görünümleri için Smarty şablonları kullanarak gibi.
controller 'işi kullanıcı modeli ve görünümü arasında bir arabulucu olarak hareket etmektir.
Kullanıcının bu arada gelip faydaları yalan nerede nasıl bir örneğe bakalım:
Basit bir blog sitesi düşünün. Veri ana parça bir yazıdır. Ayrıca, site sonrası görülüyor sayısını izler düşünün. Biz bunun için bir SQL tablosu oluşturmak gerekir:
posts
id date_created title body hits
Şimdi en popüler 5 Mesajları göstermek istiyorum varsayalım. Burada olmayan bir MVC uygulamada görebilirsiniz ne:
$sql = "SELECT * FROM posts ORDER BY hits DESC LIMIT 5";
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
echo "<a href="post.php?id=$row['id']">$row['title']</a><br />";
}
Bu pasajı oldukça basittir ve eğer iyi çalışır:
- Size en popüler mesajları göstermek istiyorum tek yerdir
- Sen nasıl görünüyor değiştirmek istiyorsanız asla
- Eğer bir "popüler sonrası" ne değiştirmeye karar asla
Eğer ana sayfada 10 en popüler mesajları ve alt sayfaları üzerinde bir kenar çubuğu en popüler 5 göstermek istediğinizi düşünün. Şimdi yukarıdaki kod çoğaltmak, ya da görüntülenen nerede kontrol etmek için mantığı ile bir içerme dosyası koymak ya gerekir.
Bugün ne oluşturulan mesajların bir "yeni-post" sınıfı eklemek için ana sayfa için biçimlendirme güncellemek istiyorsanız?
Eğer yorum, değil hit bir yeri vardır çünkü yazılan popüler olduğuna karar varsayalım. Veritabanı, bu yansıtacak şekilde değişecektir. Şimdi, popüler Mesajları gösterir uygulamanızda her yerde yeni mantığını yansıtacak şekilde güncelleştirilmesi gerekir.
Sen karmaşıklık formun bir kartopu görmeye başlıyor. Bu işler bir projenin seyrini üzerinde korumak için giderek daha zor hale nasıl görmek kolaydır. Birden çok geliştiriciler bir proje üzerinde çalışırken Ayrıca, karmaşıklığı göz önünde bulundurun. Tasarımcı çıkışına bir sınıf eklerken veritabanı geliştiricisi danışmak zorunda mıyım?
MVC yaklaşımı benimsemek ve uygulama içinde kaygıları ayrılmasına zorlayarak bu sorunları azaltabilir. İdeal üç alanları içine dışarı ayırmak istiyorum:
- veri mantığı
- uygulama mantığı
- ve ekran mantık
Şimdi bu nasıl görelim:
Biz model ile başlayacağız. Biz bir $post_model
sınıf var ve bunu denilen bir yöntem vereceğiz get_popular()
. Bu yöntem, mesajların bir dizi döndürür. Ayrıca biz o dönmek için mesajların sayısını belirtmek için bir parametre vereceğim:
post_model.php
class post_model {
public function get_popular($number) {
$sql = "SELECT * FROM posts ORDER BY hits DESC LIMIT $number";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)) {
$array[] = $row;
}
return $array;
}
}
Şimdi ana için biz controller, biz "ev" diyeceğiz var. Kullanıcının biz ana sayfa istendiğinde bizim denetleyicisi çağıran bir url yönlendirme düzeni olduğunu hayal edelim. It işi popüler mesajları almak ve doğru bir bakış onlara vermek için:
home_controller.php
class home_controller {
$post_model = new post_model();
$popular_posts = $post_model->get_popular(10);
// This is the smarty syntax for assigning data and displaying
// a template. The important concept is that we are handing over the
// array of popular posts to a template file which will use them
// to generate an html page
$smarty->assign('posts', $popular_posts);
$smarty->view('homepage.tpl');
}
Şimdi view neye benzer görelim:
homepage.tpl
{include file="header.tpl"}
// This loops through the posts we assigned in the controller
{foreach from='posts' item='post'}
<a href="post.php?id={$post.id}">{$post.title}</a>
{/foreach}
{include file="footer.tpl"}
Şimdi bizim uygulamasının temel parçaları var ve endişeleri ayrımı görebilirsiniz.
model veri alma ile ilgilidir. Bu veritabanı hakkında, SQL sorguları ve LIMIT tablolar bilir bilir. Bu güzel bir dizi geri teslim gerektiğini bilir.
controller onlar ana bakıyor ki, kullanıcının isteği bilir. Bu anasayfa 10 popüler Mesajları göstermek gerektiğini bilir. Bu model verileri alır ve görünümüne verir.
view mesajların bir dizi onlardan sonra mola etiketleri ile Achor etiketleri bir dizi olarak görüntülenir gerektiğini bilir. Bir sonrası bir başlık ve bir id olduğunu bilir. Bu yazının başlığı çapa metin için kullanılan ve mesaj id href kullanılması gerektiğini gerektiğini bilir. Görünümü de sayfada gösterilen bir başlık ve altbilgi olması gerektiğini bilir.
Her parça doesn't bildiklerini söz etmek de önemlidir.
model popüler mesaj ana sayfada gösterilir olduğunu bilmiyor.
controller ve view mesaj, bir SQL veritabanında saklanır olduğunu bilmiyorum.
controller ve model ana sayfasında yazılan her bağlantı ondan sonra bir mola etiketi olması gerektiğini bilmiyorum.
Peki, bu durumda biz veri mantık (model), uygulama mantığı (kontrolör) ve ekran mantığı (görünüm) arasındaki endişeleri net bir ayrım kurduk. Peki şimdi ne olacak? Biz kısa ve basit bir PHP parçacığını aldı ve üç kafa karıştırıcı dosyaları içine kırdı. Bu bize ne veriyor?
Endişeleri bir ayrılık sahip yukarıda belirtilen konularda bize yardımcı olabilir nasıl bakalım. Yinelemek için, biz istiyoruz:
- Alt sayfaların bir kenar çubuğu popüler mesajları göster
- Ek bir css sınıfı ile yeni mesaj vurgulamak
- "Popüler post" yatan tanımını değiştirin
Iki dosya bizim altsayfa ekleyeceğiz bir kenar çubuğuna popüler Mesajları göstermek için:
Bir altsayfa denetleyici ...
subpage_controller.php
class subpage_controller {
$post_model = new post_model();
$popular_posts = $post_model->get_popular(5);
$smarty->assign('posts', $popular_posts);
$smarty->view('subpage.tpl');
}
... Ve bir alt sayfa şablonu:
subpage.tpl
{include file="header.tpl"}
<div id="sidebar">
{foreach from='posts' item='post'}
<a href="post.php?id={$post.id}">{$post.title}</a>
{/foreach}
</div>
{include file="footer.tpl"}
Yeni altsayfa controller altsayfa sadece 5 popüler Mesajları göstermek gerektiğini bilir. Altsayfa view altsayfaları bir kenar çubuğu div içindeki mesajların listesini koymak gerektiğini bilir.
Şimdi, ana sayfasında yeni mesajları vurgulamak istiyorum. Biz homepage.tpl değiştirerek elde edebilirsiniz.
{include file="header.tpl"}
{foreach from='posts' item='post'}
{if $post.date_created == $smarty.now}
<a class="new-post" href="post.php?id={$post.id}">{$post.title}</a>
{else}
<a href="post.php?id={$post.id}">{$post.title}</a>
{/if}
{/foreach}
{include file="footer.tpl"}
İşte view popüler Mesajları görüntülemek için yeni mantık işler. controller ve model bu değişimle ilgili bir şey bilmek gerek yoktu. Bu tamamen ekran mantığı. Altsayfa liste daha önce yaptığı gibi yukarı göstermeye devam ediyor.
Son olarak, bir popüler sonrası ne değiştirmek istiyorum. Bunun yerine bir sayfa var hit sayısına dayalı olan, biz bir post var yorumların sayısına dayalı olmak istiyorum. Biz modele o değişikliği uygulayabilirsiniz:
post_model.php
class post_model {
public function get_popular($number) {
$sql = "SELECT * , COUNT(comments.id) as comment_count
FROM posts
INNER JOIN comments ON comments.post_id = posts.id
ORDER BY comment_count DESC
LIMIT $number";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)) {
$array[] = $row;
}
return $array;
}
}
Biz "popüler sonrası" mantık karmaşıklığı artmıştır. Ancak, bir kez biz bir yerde, model bu değişikliği yaptık, yeni mantık her yerde uygulanır. Başka hiçbir değişiklik ile ana ve alt sayfa, şimdi yorumlarına dayanarak popüler mesajları gösterecektir. Bizim tasarımcı bu işin içinde olması gerek yoktu. Biçimlendirme etkilenmez.
Umarım, bu veri mantığı, uygulama mantığı ve ekran mantığı endişelerini ayıran nasıl bir zorlayıcı bir örnek sağlar, kolay uygulama geliştirme yapabilirsiniz. Bir alanda değişiklik diğer alanlar üzerinde bir etkisi daha az sahip olma eğilimindedir.
Bu sözleşmeyi takiben otomatik olarak kod mükemmel yapacak sihirli bir değnek değildir. Ve şüphesiz ayrılık olması gereken yerde çok daha az açıktır konularda karşı karşıya geleceksiniz. Sonunda, tüm uygulama içinde karmaşıklığını yönetme ilgili.
Eğer modelleri oluşturmak nasıl düşünce bol vermelidir. Arayüzlerin ne tür onlar (sözleşmelerine ilişkin Gregory'nin cevaba bakınız) verecek? Denetleyicisi ve görünümü ne veri formatı ile çalışmak için bekliyor? Vaktinden önce bu şeyler hakkında düşünmek yolda şeyler daha kolay hale getirecek.
Birlikte güzel çalışma tüm bu parçaları almak için bir proje başlatırken Ayrıca, bazı havai olabilir. Birçok model için yapı taşlarını oluşturur çerçeveler, kontrolörler, çiftleşmiş motorları, url yönlendirme, ve daha fazlası vardır. PHP MVC çerçeveler önerileri için SO birçok diğer mesajları görürsünüz. Bu çerçeveler kalkmak ve çalışan ama geliştirici olarak karmaşıklığı yönetmek ve endişeleri bir ayrılık zorlama sorumlu olan olacaktır.
Ben de yukarıda kod parçacıkları sadece örnek basitleştirilmiş olduğunu farkedeceksiniz. Onlar (büyük olasılıkla) hataları olabilir. Ancak, onlar benim kendi projelerinde kullanmak kod yapısında çok benzer.