Nasıl MVC için bir Page-Tabanlı PHP Uygulama dönüştürme musunuz?

11 Cevap php

MVC framework kullanarak bir sayfa tabanlı PHP uygulamasını recodesrc tam olarak nasıl süredir mücadele ettik. Sadece arka plan için, benim patronum beni yapıyor çünkü MVC içine uygulamayı taşımak için yaşıyorum. Neyse, oturdu, ve dizin yapısını basılı ettik. Sonra ben denetleyicisi / eylem çiftleri içine bu sayfaları çevirebilirsiniz nasıl planı çalışıyorum başladım. Bazı şeyler çok yalındır görünüyor. Örneğin, bir kullanıcı silme / düzenle / eklemek için ayrılmış bir çift sayfaları vardı. Bu bir "kullanıcı" denetleyicisi oluşturmak ve yöntemleri veya ekleme / düzenleme / silme için eylemler eklemek çok kolaydır. Ben sorunları yaşıyorum Nerede aslında her zaman bu kadar açık değil gibi, sadece bir eylem şey yapma karşı bir denetleyicisi oluşturmak için zaman karar vermektir. Örneğin, kullanıcı / giriş veya kullanıcı / register karşı bir kayıt denetleyicisi karşı bir giriş denetleyicisi. Benim için, nesne bir eylem olması için mükemmel mantıklı, ama o zaman sadece çok kesin olmayan bir şey yapmak eğer.

Başka bir örnek bir "planı" oluşturmak için kullanılan yaklaşık 12 form sayfalarını var, olacaktır. Kafamda ben bir "plan" denetleyicisi oluşturmak için gerekli düşünürdüm, ve sayfaları için eski her biri daha sonra bir eylem olacaktı. Yani 12 eylemler (yöntemleri) ile bir denetleyici olurdu. Benim için sorun bu sayfaların rağmen 12 sonunda onlar ortak, hepsi bu "plan" makyaj veri giriş formları olmasıdır. Sayfaların her veritabanında farklı tabloları kullanmak ve birbirleri ile ortak başka bir şey var. Temelde bir "plan" denetleyicisi oluşturarak ben sadece gerçekten kullanıyorum bir gruplama mekanizması olarak; birbirleri ile ilgili bir şey var çünkü mutlaka bunu kullanarak değil. En azından yukarıda "kullanıcı" denetleyicisi örnekte; Bu eylemlerin her biri aynı "kullanıcı" tablosunu kullanır, bu yüzden tek bir denetleyici içine grubuna bu eylemleri mantıklı. Ben bu veri girişi her biri orada kendi denetleyici oluşturur yapmak gerekir?

Ben sadece kendim yerine nesneleri / eylemler bir hiyerarşi yapısı varlık olarak denetleyicileri kullanmak icar aşağı kaynar sanırım. Bu sadece denetleyiciler yanlış şekilde kullanarak bu tuzağına düşmek gerçekten çok kolay görünüyor. Herkes ne dediğimi anlıyor mu? Umarım çok kafa karıştırıcı değil.

EDIT: Ben denemek ve görmek başına bir kontrolör ile sopa; Sonra bir minimuma istek başına kod tutmak olacaktır. Bu en iyi yolu nedir?

EDIT: Herkes ne söylediğini itibaren, bu görünümden başına bir denetleyici benim yararına olmaz gibi görünüyor. Bir kontrolör acele yağ haline gelebilir gibi görünüyor çünkü ben hala bazı endişeler var, ama bu başka bir tartışma için. Ben de hala yerine bir eylemin bir denetleyici kullanmak için bu karar ne zaman bazı sorunlar var. Bunun iyi bir örneği overflow kendisi yığını olacaktır. Sayfanın üst kısmında, biz kabul olabilecek bir "Sorular" seçim "soruları" denetleyiciye götürür zorunda. Ben bu, çünkü sağ tarafta URL noktaları "soruları sormak /" hangi, "soru sor" seçebilirsiniz söylüyorlar. Bu sizin kullanarak soruları denetleyici yöntemi sormak mantıklı. Ne beni karıştırır sonra menüde "Cevapsız" seçeneğini olması. Bu başlı başına bir denetleyici var gibi görünüyor. Neden sadece "soru / cevapsız" gibi sorular denetleyici altında bir eylem olmaz? Şeyler benim için çamurlu hale orası.

11 Cevap

Patronun terim mutlu olduğundan, ona "refactor" aramak için söyle

Biraz Sorunuza konu dışı ... tanrı aşkına eski URL'LER unutma. Varlık nedeni size yeni sitede anahtarı ve onun güzel URL'LER çevirmek dakika, arama motorları tarafından düzenlenen toplu tüm içeriği yavaş yavaş aşağı yönlü SEO istatistikleri alarak sona erecek olmasıdır.

GÜNCELLEME: Ben denemek ve görmek başına bir kontrolör ile sopa ... Sonra bir minimuma istek başına kod tutmak olacaktır, ancak bu en iyi yolu nedir?

Ben doğru anlamak, her bir denetleyici bir sayfa üretecektir. Bu bir bakım konumuna ilk elden yaşadım gerçekten kötü bir fikir olabilir. Basın bültenleri, bir off, bilgilendirme, vb ve denetleyicileri bir dizi başına henüz daha sadece bu görüşleri hizmet veren veya bir denetleyicisi içine bu sopa: Eğer gerçekten bir kategori içine koymak o OO paradigmalar iyi uyuşmuyorsa içerik varsa Daha ince taneli kontrolü bırakmak kategori.

Ben o ele "MVC" çerçeve kesmek ve spagetti kod dolu hızlı bir şekilde kıvrık karışıklık oldu görüntülemek için bir denetleyici yaptım.

Ben bir "planı" oluşturmak için kullanılan yaklaşık 12 formu sayfaları var.

Ben bir "planningform" denetleyicisi muhtemelen en iyi olan, benzer ve göründüğü kadar aptal bir şey yapmak zorunda kalmıştım. Evet orada beslemek için birden fazla tablo vardır, ama $ _SESSION ['plannerController'] gibi basit şeyler yapabilirsiniz | kontrol genel formun her bölümünü tutmak ['konu eylem'] [anahtar] [değer]. Çok sayfalı bir form her yöntem sap parçası olması da bir yararı olabilir (örn. Patronun ne sadece 12 sayfaların arasından 6 lüzum ya da ne olursa parçası 7 gerçekten karmaşık hale gelir ve otomatik tamamlama ajax gibi şeyler gerekiyor diyorsa).

birbirleri ile ilgili bir şey var çünkü mutlaka bunu kullanarak değil mekanizma gruplama.

Ben genellikle bir sınıf, tek bir amaç paradigma gibi ama bazen sadece denemek ve bunu yapmak mantıklı değil. Doğru metin kitap OO ve diğer zamanlarda dışına kesin, akademik BS cehenneme gidebilir durumlar vardır. Sizin OO kalıp uymaz şeyler bulmak için gidiyor, böylece bir adım geri almak ve ortak kategoriler içine şeyler birleştirmek için deneyebilirsiniz.

Böyle bir hamle yaparak, sadece belirli bir sitenin uygulaması değişiyor, fakat daha ziyade algılanan hangi şekilde değişiyor değil. Sen zaten değiştirilemeyen bir ağır düşeni yapmak zorunda gidiyoruz, ama sen kavramını anlamak ve bunu yapmak için nasıl deneyime sahip avantajı var.

Benim önerim oturup ve siteyi nasıl uygulanacağı hakkında bir şey biliyor gibi davranmak olabilir, ama sorunlar üzerinde çalışıyoruz sitenin tür ile ilgili ne hakkında her şey olur - onun gereklerini ve gotchas. Site yapmak için nasıl bir MVC tabanlı bir kavramsallaştırma oluşturun ve sonra da mümkün olduğu gibi çok kod yeniden deneyin. Kod yeniden sonuçta mümkün olmayabilir, ama parlak tarafında, en azından daha önce aynı sorunların birçok çözdük, bu yüzden uygulamaya kadar uzun sürmemelidir.

Her zaman yine aynı düzeni ödünç edememek ya da farklı kontrolörleri, eylemleri ve görünümleri kullanmak için izin, farklı kontrolcü kullanılarak formu sayfaları bir dizi gibi bir şey için mantıklı bir URL yapısını korumak için yönlendirme kullanabileceğiniz unutmayın şablonu.

Denetleyici başına bir görünüm sahip noktası nedir? Her şey sadece eşleşen çifti ne gerek endişeleri bir ayrılık için var?

Ben bir şekilde ilgili çeşitli incelemeler denetleyen bir kontrolör yazmaya daha meyilli olurdu. Örneğin, bir kullanıcının yukarıda belirtilen add / view / düzenleme. İstediğiniz kodu için birçok dosyaları aracılığıyla arıyor, birbirine benzer işlevler tutmak yerine isterdim. Bu bir yerde (belirli bir nesne için) tanımlanan tüm yöntemleri var da kullanışlı. Bakım KADAR kolaylaştırır.

Ben 'eylem' başına ayrı bir dosya oluşturulmuş bir PHP framework kullanarak bir proje üzerinde çalıştı. 'Nesne (eylem)' gibi adli ve korumak için bir kabus oldu.

Şimdi tek bir dosyada tüm modellerini tutan süre biraz için Django kullanarak oldum, hepsi tek bir dosyada Defa (denetleyiciler) ve ayrı ayrı şablonları (görünümleri). [Django MVC değil ama bu amaçlar için en olduğunu farzedelim]. Bu bir yerde sizin gruba birlikte ortak kod verir ve bakım çok daha kolay olur.

Benim tek tavsiyem - MVC bazı idealine dayanan proje düzenlemeye kalkmayın. Sizin ve etki mantıklı nasıl projenizi düzenleyin. MVC arttırmak, karmaşıklığı değil sınırlamak için önerilmiştir.

Planın Örneğin, ben bir denetleyici içine olur. www.example.com/plan/1 .. / eylemler mantıksal bazı görev oluşturmak için birlikte gruplandırılmış çünkü mantıklı / 2 planı vb.

Bir denetleyici, benim görüşüme göre, bir görev ya da bir nesneyi yönetmek için kullanılmalıdır. Bu yöntemler bir nesne kullanmak / o görevi tamamlamak veya değiştirmek için gereken belirli eylemleri olmalıdır bulunuyor.

Denetleyici başına bir görünüm sahip noktası nedir?

Tekrar:

  1. Sen istek başına gerekli olandan daha fazla kod yüklenmiyor. Eğer ihtiyaç olmadığını, bir kütüphane, paket, dll yüklemek istiyorsunuz? Elbette değil. Yani kod sadece küçük bir kısmı istek başına idam edilecek büyük bir kontrolör dosya oluşturmak değil. Ayrıca, küçük resimler sadece küçük yöntemleri ve modüler kodu gibi, imo bakımı daha kolaydır.
  2. denetleyicisi ve görünümü arasında açık bir bağlantı 01:01 (onlar aynı adı paylaşan, özellikle eğer) vardır. Bu bir kuralıdır. Bu açık ve tutarlı. Ben bir görünüm şablona bakıyorum, ben sadece dosya adına göre onu yükler tam denetleyicisi biliyorum. Dahil hiçbir düşünce yoktur. Hiçbir kararları. Taviz yok.

Her şey sadece eşleşen çifti ne gerek endişeleri bir ayrılık için var?

Ne gerek endişeleri bir ayrılık için var? Eğer grup ile ilgili sayfaları (kontrolörleri / Defa) istiyorsanız, dizinleri onları yumru.

Ben bir şekilde ilgili çeşitli incelemeler denetleyen bir kontrolör yazmaya daha meyilli olurdu. Örneğin, bir kullanıcının yukarıda belirtilen add / view / düzenleme. İstediğiniz kodu için birçok dosyaları aracılığıyla arıyor, birbirine benzer işlevler tutmak yerine isterdim. Bu bir yerde (belirli bir nesne için) tanımlanan tüm yöntemleri var da kullanışlı. Bakım KADAR kolaylaştırır.

Ben saygıyla katılmıyorum gidiyorum. Ben bir kullanıcı düzenleme / görüntüleme / eklemek için sorumlu olduğu tek bir görünüm varsa, o zaman 1:01 kongre ile ben tam denetleyici sorumlu biliyorum. Öte yandan, benzer bir işlevsellik gruplama sizin öneri kullanarak ben bir yönetici denetleyicisi ve bir yönetici için add / view / edit içeren tek bir kullanıcı denetleyicisi varsa? Kullanıcı veya yönetici? Şimdi düşünmek zorunda, ya da arama.

Ben 'eylem' başına ayrı bir dosya oluşturulmuş bir PHP framework kullanarak bir proje üzerinde çalıştı. 'Nesne (eylem)' gibi adli ve korumak için bir kabus oldu.

Ben demiyorum.

Şimdi tek bir dosyada tüm modellerini tutan süre biraz için Django kullanarak oldum, hepsi tek bir dosyada Defa (denetleyiciler) ve ayrı ayrı şablonları (görünümleri). [Django MVC değil ama bu amaçlar için en olduğunu farzedelim]. Bu bir yerde sizin gruba birlikte ortak kod verir ve bakım çok daha kolay olur.

Ben şimdi whoosy hissediyorum. Django bilmiyorum, ve ben tek dosyaları isteğe varsayarak yaşıyorum, ama ben on hatlarının binlerce içeren bir dosya muhafaza ediyorum yolu yoktur.

Benim tek tavsiyem - MVC bazı idealine dayanan proje düzenlemeye kalkmayın. Sizin ve etki mantıklı nasıl projenizi düzenleyin.

Hayır, hayır, hayır. Bu çok tehlikeli bir tavsiyedir. Tasarım desenleri, kodlama sözleşmeler ve çerçeveler bir amaç için dizayn edilmiştir - en iyi uygulamaları ve tutarlılık. Sadece bir guru dışında kuralları adım olmalı ve o / o yalnız çalışır sadece. Ben kod yazarken veya bakımını yaparken düşünmek zorunda kalmamak için bile bir çerçevenin sınırları içinde, sürekli daha fazla tutarlılık için çalışıyoruz.

Ben bu geçen yıl böyle bir şey geçti. Ben Kohana PHP Framework kullanmak için çoğunlukla statik PHP web sitesi sayfalarını dönüştürülür. Ben tek tek sayfaları için manzaralı, her web sitesi bölüm kontrolörü yaptı. Ana sayfa görüntüleme diğer başlık için görünümler ve altbilgi dahil. Bu tür makaleler için gibi görünümleri, bazıları, farklı kontrolörler tarafından yeniden idi. Sonuç orijinal web sitesi olarak aynı sayfa URL'leri ile bir MVC site oldu.

EDIT:? URL'ler / denetleyici / yöntemi, argümanların biçimindedir. Örnek olarak, sitemde, URL / bilgisayar / Article.php için? Id = # computer denetleyicisi article fonksiyonunu kullanır. computer kontrolör, sırayla, iç içe paragraph manzaralı bir article görünüm içine veri yüklemek için article modelini kullanır. Bu da sitenin önceki sürüm URL. Php uzantılı sayfa adları olmasına rağmen, bu hala bir denetleyici sınıf yöntemi ve sitenin MVC tabanlı sürümü aynı URL işleri çevirebilir göstermektedir. Bu sizi ve Kohana siteniz için işe yarayabilecek nasıl bir fikir vermelidir.

Ben de hala yerine bir eylemin bir denetleyici kullanmak için bu karar ne zaman bazı sorunlar var. Iyi bir örnek bu stackoverflow web sitesi olacak. Sayfanın üst kısmında, biz kabul olabilecek bir "Sorular" seçim "soruları" denetleyiciye götürür zorunda. Sağ tarafta URL noktaları "soruları sormak /" için "bir soru sor" seçebilirsiniz, çünkü bu demek. Demek kullanarak soruları denetleyici yöntemi sormak mantıklı.

"Ask" "soruları" kontrolörün bir eylem olup olmadığını Peki, biz bilmiyoruz. Bu site, farklı bir kontrolöre "soruları sormak /" url yönlendirme, ya da "rica" ​​olabilecek bir "soru" dizininde bir denetleyicisi olabilir. Eğer "soruları sormak /" sayfasını getirmek eğer Ayrıca, form "soruları / / yazıyı sormak için" haberi alır fark edeceksiniz. Şimdi "post" "ask" eylem yöntemi için bir parametre olabilir, ama ben bir "rica" ​​kontrolör "post" eylem yöntemi olduğunu tahmin ediyorum.

Kim bilir. "Sorular" sayfa "Soru Sor" sayfasında birkaç kat fazla kod gerektirir: Ama bu düşünün lütfen. O "Soru sor" sayfasını yüklerken "Sorular" sayfa kodunu yüklemek için mantıklı olur. Ben stackoverflow çocuklar daha zeki olacağını düşünmek istiyorum.

Ama bana ne karıştırıyor, o zaman menüde "Cevapsız" seçeneğini olması. Bu başlı başına bir denetleyici var gibi görünüyor. Neden sadece soruları denetleyici altında bir eylem olmaz? "Soru / cevapsız" gibi mi? Şeyler benim için çamurlu hale orası.

Ben "Soru Sor" sayfa kendi denetleyicisi olan başka bir neden. "Sorular" sayfa "Cevapsız" sayfası ile ortak çok daha fazlası vardır.

Ben doğru anlamak, her bir denetleyici bir sayfa üretecektir. Bu bir bakım konumuna ilk elden yaşadım gerçekten kötü bir fikir olabilir.

Ben o ele "MVC" çerçeve kesmek ve spagetti kod dolu hızlı bir şekilde kıvrık karışıklık oldu görüntülemek için bir denetleyici yaptım.

Çünkü çerçevede, geliştirici, ya da her ikisi de bu oldu mu? Nasıl korumak için zordu? Ne kesmek neden dahil edildi ve?

1 görünümüne 1 kontrolör php MVC çerçeveler Zend, CodeIgniter ve Kohana benim için iyi çalışır. ASP.NET 'te, MVC, 1 webform / görünüm dosyası arkasında 1 koduna eşleştirilir olmasa da.

The whole concept was made more clear to me by a series of three blog posts by Nemetral that explain the pattern as it evolves from a traditional Web page script and thus as the PHP logic becomes separate from the presentation logic, thus in terms of MVC, how a model becomes separate from the view . According to Nemetral:

  1. Ilk adım artık sayfanın başkanı, HTML etiketleri ile birleştiğinde kadar oldu tüm PHP kodu taşımaktır.
  2. İkinci adım, ayrı bir dosyaya tüm HTML etiketleri taşımak ve de bir PHP üzerinden erişmek için. Bir istek yapıldığında yüzden PHP kodu (kontrolör ve model) yönlendirilir ve bu kodu daha sonra HTML etiketleri veya sunum (görünüm) ister.

Benim tez bu konuda daha fazla yazmak: http://kreus-cms.com/kreus/pages/written_work

Eğer uygulama işlevselliği (? Tümü) en kapsayan, eldeki testlerin çeşit var varsayarsak.

  1. C-parçası gibi görüneceğini nasıl bir gerçekten temel yapısını eti.
  2. M ve V görmezden bu yapıyı uygulamak, daha fazla veya daha az sadece kontrolörler içine sayfasından odaklı dosyalarından kod parçacıkları kopyalama
  3. Her şey beklendiği gibi hala çalışmakta olduğunu Testi
  4. "M" ve "V" ayıklamak, her denetleyici geçmesi. "M", sadece bir Active Record (Biliyorum, bu gerçek bir model değil) ya da bir satır tablo ağ geçidi veya uygulamak oldukça hızlı bir şey olabilir. Kontrolör şimdi daha ince ve daha ince olması gerektiğini
  5. Her şey beklendiği gibi hala çalışmakta olduğunu Testi
  6. Şimdi uygulama hakkında her şeyi biliyorum, varsa bir etki alanı modeli çıkarmak için tekrar refactor. Bazı durumlarda, bu sadece zaman kaybı (CRUD-only/-intensive uygulamaları) olabilir
  7. Her şey beklendiği gibi hala çalışmakta olduğunu Testi.

Ben en çok sorun her zaman bu kadar açık olmayabilir, çünkü aslında bir şey sadece bir eylemi yapma vs denetleyicisi oluşturmak için zaman karar olduğunu yaşıyorum nerede.

Mümkün, bakış başına bir denetleyici kullanmak. Bu şekilde:

  1. Eğer istek başına gerekli olandan daha fazla kod yüklenmiyor
  2. denetleyicisi ve görünümü arasında açık bir bağlantı 01:01 (onlar aynı adı paylaşan, özellikle eğer) vardır.