"Sihirli" olmadan PHP MVC

6 Cevap php

Diyelim ki gibi görünen bir eylem http://site.com/admin/posts/edit/5 gibi bir adresi eşler bir PHP Model-View-Controller çerçeve var diyelim

Posts_Controller::editAction($id)

dosyasında /admin/controllers/posts.php

Şimdi, ben baktım birçok mevcut PHP çerçeveler benzer bir şey bu başarmak istiyorsunuz

$module = Router::getModule(); // "admin"
$controller = Router::getController(); // "posts"
$action = Router::getAction(); // "edit"
$params = Router::getParams(); // array(5)

$controller_file = "/".$module."/controllers/".$controller.".php";
$controller_classname = ucfirst($controller)."_Controller";
$method = $action."Action";

require_once $controller_file;
$controller_obj = new $controller_classname();
call_user_func_array(array($controller_obj,$method),$params);

Bana göre, bu kötü kokuyor ve çok "büyülü" gibi görünüyor: Ben dinamik olarak bir dize kapalı tabanlı sınıflar oluşturmak mümkün olmalıdır inanmıyorum, o dizeleri olarak belirtilen bu metodlarını çağırır.

Ayrıca da kötü kokuyor eylemleri, aramak için yansıma kullanmak alternatifler gördük.

Şimdi daha büyük, modüler CMS her bir "sayfa" tipi için DB bir tablo vardır benzer bir MVC çerçevesinde kapalı inşa sahip hayal: blog, statik, fotoğraf albümü, vs .. Bunun için bir uygulama olduğunu hayal benim önceki örneğe benzer.

Ben bu kötü olduğunu düşünüyor tek ben miyim? Eğer değilse, bu durumu kapsayacak bir tasarım modeli olmamalıdır?

To Clarify:

Modülü, denetleyici, eylem hakkında bilgi içeren bir sorgu haritasına bazı good yolu var mı, ve parametreler içine

  1. Eklemek için bir dosya
  2. Örneğini A sınıfı
  3. 'Aramak için bir yöntem

Yani mümkün olduğunca little "sihirli" (dize sınıf-veya-to-yöntemi veya yansıması) olarak kullanır?

Daha da iyisi: bu nasıl yansıma olmadan, C # veya Java yapılabilir ki? Ben bir dosya konumuna gelmesi dizeleri bitiştirmek için izin verebilirsiniz.

6 Cevap

Iki soru burada, aslında vardır.

  1. Düzgün burada kullanılan bir dil olarak PHP.
  2. Bu kodun mantığı çok "büyülü" olduğunu

Ben çoğunlukla bazı MVC çerçeveye dayalı web uygulamaları geliştirme dahil bir PHP geliştiricisi ve yazılım mühendisi olarak o benim görünümü verebilir

1) Every language comes with its own syntax that provides more or less expressiveness. I agree that all the power of one language should not be used on every line of code for the sake of readability and simplicity. But in this case, where core of the MVC is designed and implemented I see no reason not to use them especially on the places where end user (application developer in this sense) doesn't see this magic if it is well encapsulated. I presume this is a simplified and stripped off snippet you posted since there should be some other considerations regarding its design, but creating new instance based on a string name, and calling a function the same way is regular approach in PHP world.

2) Ben muhtemelen geliştirici genellik sözünü sağlar özellikle çünkü bu kod, biraz büyülü akıllıca bir mantık olduğunu kabul ediyorsunuz. Bu konuyla ilgili farklı yaklaşımlar çoğu kez çözümün genelliği azaltmak ve (dediğin gibi örneğin DB) komutu harita ya da benzeri bir yaklaşımla haritalama doğrudan tanımının bazı araçları sağlamak vardır. Bu şekilde sihirli geliştirici elinde altındadır. Manuel bir sürü iş sizin durumda yönlendirici sihirli automagically çözüldüğünde eşleştirmeleri ayarı olmadığından bu, genel olarak, hızlı gelişimi için uygun değildir.

Bu biraz yardımcı olur umarım.

Cheers, Ivan

Bu fabrika desen çeşit tarafından ele olurdu, PHP sadece bazı güzel sözdizimsel şeker fabrikası desen etrafında tüm uygulanmasını önlemek için yapar. Ben sadece dili yararlanarak ediyor, bu hiç de sihir olduğunu sanmıyorum.

Sana bakmak vermedi çerçeveler bilmiyorum. Ben şimdiye kadar (CodeIgniter'ı ve Yii) kullanılan olanları sihrini, ama güvenceleri var. Örneğin, tüm kontrolörler Controller sınıfından uzatıldı gerekir, bu yüzden, any class sadece bir denetleyici başlatamazsınız. CodeIgniter ile, tarayıcı üzerinden erişilebilir olmamalıdır tüm denetleyici yöntemleri bildirilen özel tavsiye edilir. Yii tüm bu yöntemler (bu örnekte "actionEdit" olacaktır) "eylem" ile adını başlamak gerektiren başka bir düzeye Bu getiriyor, bu yüzden gerçekten dışarıdan bazı keyfi yöntemi arayamazsın.

O emin insanlar kurallara yapar çünkü ben, tüm bu sihirli bir takım birden çok geliştiriciler olduğunda çok yararlı buluyorum ve birbirlerinin koduna almak ve neler olduğunu anlamak çok daha kolay. Bu tür sözleşmeler zorunlu olmadan, nereye ve daha sonra nereye gittiğini bulmak için PHP kodu içine kazma bağlantı açar tarayıcı izleme zaman harcamak zorunda. PHP gibi pek gevşek dili ile büyük bir karmaşa dönüşebilir (hiçbir katı türleri, vb ilk kullanımda, dinamik diziler, ilan değişkenler) C # veya Java PHP o çerçeveler için iş, emri uygulayan bir dil olarak.

I don't believe that you should be able to dynamically create classes based off of a string, then call methods on it specified as strings.

İşte en yapmamız mümkün olmaması "gerektiğini" keyfi bir şey gibi görünüyor?

Bahsettiğin sihirli sadece bir soyutlama değildir. Sen (umarım) zaten gün-gün iş soyutlama her türlü kullanın.

Peki bu özel soyutlama hakkında sakıncalı mı?

Üzerine alın ve işe geri almak: Ben gerçekten bu soruya en iyi cevap olduğunu düşünüyorum! :-)

Eğer sorun ORM büyü sadece bir muggle değil MVC ile konum gibi geliyor.

Ben çalıştığım şeylerin çoğu için, MVC framework çok şişirilmiş gibi görünüyor.

Ben smarty gibi bir çiftleşmiş motoru kullanmayı tercih (www.smarty.net)

Hala kod ve sunum aynı ayrımı olsun. Ben size tüm dosya ve dizin yapısını yönetmek konum kod kıvrımlara organizasyonu oluşturur bulunuyor bulmak. Kod yerine sayfalara göre daha mantıklı toplanabilir.