Görünüm doğrulama yapmamalı mı?


10

Ben "okuyordu MVC gereken bir model, tanıtıcı doğrulama? " Ben doğrulama mantığı bir MVC web sitesinde gitmeli merak çünkü. Üst yanıttaki bir satır şöyle: "denetleyiciler doğrulamayı işlemeli, modeller doğrulamayı işlemeli."

Bunu sevdim, ancak birkaç nedenden dolayı Görünüm'de neden veri doğrulaması yapmayacağımızı merak etmeme neden oldu:

  1. Görünümler genellikle güçlü doğrulama desteğine sahiptir (JS kitaplıkları, HTML5 etiketleri)
  2. Görünümler yerel olarak doğrulanabilir ve ağ ES'sini azaltabilir
  3. Kullanıcı arayüzü zaten veri türü göz önünde bulundurularak tasarlanmıştır (tarihler için takvimler, sayılar için döndürücüler).

Birden fazla yerde geçerli kılmak MVC'nin sorumlulukları izole etme kavramına aykırıdır, bu nedenle "her ikisinde de yapın" uygunsuz görünmektedir. Veri doğrulaması sadece kontrolörde gerçekten baskın bir yaklaşım mıdır?


Buradaki sorun yanlış bir ikilikten biri olabilir: birden fazla yerde doğrulama yapamamanızın bir nedeni yoktur ve durumu "ya ikisinden biri" olarak düşünerek bu sorunun görüşünü bulanıklaştırıyor olabilir (pun!) . Örneğin, bir web sitesinde bir tür istemci tarafı doğrulama yapmak, kullanıcılar anında geri bildirim aldıkları için gerçekten yararlı olabilir, ancak aynı zamanda güvenilir değildir, bu yüzden tek doğrulama olamaz.
Miles Rout

Yanıtlar:


10

Tüm doğrulamanın gitmesi gerektiğini söyleyebileceğiniz tek bir yer olduğunu sanmıyorum. Bunun nedeni, standart bir asp.net mvc web sitesinde birlikte çalışan birkaç farklı rakip programlama stratejimiz olmasıdır.

İlk olarak, etki alanı mantığını modellere, 'eylem' mantığını denetleyicilere ve ekranı bir görünüme ayırma fikrimiz var. Bu, tüm mantığın tarayıcıda sadece görünümün bir görüntüsünü sağlayan tarayıcıda gerçekleşeceği fikrine dayanır.

Ardından, istemci tarafı javascript'i kullanarak Görünümü genişletiriz. Bu, Jquery / nakavt / açısal ile 'bir sayfa web sitesi' fikri yaygın bir uygulamadır.

Bu uygulama, kendisi bir MVC veya MVVM kalıbı uygulayan bütün bir istemci tarafı uygulaması yazmaya eşdeğer olabilir. Görünümü bir Veri Aktarım Nesnesine ve Denetleyiciyi bir hizmet uç noktasına indiriyoruz. Tüm işletme ve kullanıcı arayüzü mantığını müşteriye taşımak.

Bu daha iyi bir kullanıcı deneyimi sağlayabilir, ancak esasen güvenilmez bir müşteriye güvenmek zorundasınız. Bu nedenle, istemcinizin isteklerini ne kadar iyi doğruladığından bağımsız olarak, sunucuda doğrulama mantığı yürütmeniz gerekir.

Ayrıca, genellikle müşteri tarafından gerçekleştirilemeyen doğrulama gereksinimlerimiz vardır. Örneğin. 'Yeni kimliğim benzersiz mi?'

En iyi deneyimi / performansı sunmak amacıyla oluşturduğunuz herhangi bir uygulama mutlaka birden fazla programlama paradigması için borç alır ve hedefine ulaşmak için onlardan ödün verir.


4
+1 ve vurgulamak için: Asla istemci tarafından gönderilen verilere güvenmeyin. Hiç.
Machado

Bunu nasıl okudum: "doğrulama ayrı bir kavram değildir - uygulamanızın tüm bölümlerinin farklı bağlamlarda birbirleriyle doğrulanması gerekir." Daha fazla iş olsa bile mantıklı.
WannabeCoder

evet, ama aynı zamanda: "hepsi farklı desenleri izleyen iki (veya daha fazla) uygulamanız olabilir"
Ewan

" den · i · rendeleyin : Haksız bir şekilde eleştirin; küçümseme. " Bu kelimeyi doğru kullandığınızı sanmıyorum. Aksi halde iyi cevap.
kdbanman

hayır, demek istediğim bu
Ewan

1

Birden fazla yerde geçerli kılmak MVC'nin sorumlulukları izole etme kavramına aykırıdır, bu nedenle "her ikisinde de yapın" uygunsuz görünmektedir.

Burada dikkate alınması gereken birden fazla doğrulama sorumluluğu olabilir mi? # 3'te söylediğin gibi:

Kullanıcı arayüzü zaten veri türü göz önünde bulundurularak tasarlanmıştır (tarihler için takvimler, sayılar için döndürücüler).

Yani belki de:

Görünüm : Giriş türünü, biçimini, gereksinimi doğrulayın ... iş mantığıyla ilgisi olmayan temel kullanıcı girişi doğrulaması. Sunucudan bir istekte bulunarak ağ trafiği oluşturmadan önce tüm bu kabarık şeyleri yakalayın.

Model : Verilerin ticari kaygılarını doğrulayın. Bu, iş kurallarına göre yasal bir değer midir? Evet, sayısal bir değer (görünümde bunu sağladık), ama mantıklı mı?

Sadece bir düşünce.


1

Kalıcılık için doğrulamaya ihtiyacınız olduğunu varsayacağım.

Sadece Görünüm değil, Model de doğrulamayı işlememelidir. BT'deki günlerim boyunca DDD'nin aslında işleri doğru bir şekilde yaptığınızdan emin olmanın yollarından biri olduğunu fark ettim . sınıflar aslında olması gereken şeylerden sorumludur.

Etki Alanına Dayalı tasarımı takip ederken, modelleriniz iş mantığınızı içerir ve hepsi bu kadar. Ancak doğrulama içermiyorlar, neden olmasın?

Etki alanı katmanınızı sürdürmek Data Mapperyerine zaten kullandığınız kadar uzak olduğunuzu varsayalım Active Record. Ancak yine de, modellerin doğrulanmasını istiyorsunuz, bu nedenle Modelinize doğrulamayı ekliyorsunuz.

interface Validation
{
    public function validate();
}

class ConcreteModel extends MyModel implements Validation
{
    public function validate() { // the validation logic goes here }
}

Doğrulama mantığı, modeli MySQL veritabanınıza doğru bir şekilde ekleyebilmenizi sağlar ... Birkaç ay geçer ve siz karar verirseniz, Modellerinizi noSQL veritabanlarında, MySQL'den farklı doğrulama kuralları gerektiren veritabanlarında depolamak istersiniz.

Ancak bir sorununuz var, yalnızca 1 doğrulama yönteminiz var, ancak a'yı Model2 farklı şekilde doğrulamanız gerekiyor .

Modeller yapmaktan sorumlu olduklarını yapmalı , iş mantığınıza dikkat etmeli ve iyi yapmalıdır. Doğrulama, iş mantığına değil kalıcılığa bağlıdır, dolayısıyla doğrulama bir modele ait değildir .

Bunun Validatoryerine, kurucularında parametre olarak doğrulamak için bir model alacak, Validationarabirimi uygulayacak ve Validatornesnelerinizi doğrulamak için bu s'yi kullanacak bir s oluşturmanız gerekir.

interface Validation
{
    public function validate();
}

class MySQLConcreteModelValidator implements Validation
{
    public function __construct(ConcreteModel $model) { }

    public function validate()
    {
        // you validate your model here
    }
}

class RedisConcreteModelValidator implements Validation
{
    public function __construct(ConcreteModel $model) { }

    public function validate()
    {
        // you validate your model with different set of rules here
    }
}

Gelecekte herhangi bir zamanda başka bir kalıcılık katmanı için başka bir doğrulama yöntemi eklemek istediğinize karar verirseniz (Redis ve MySQL'in artık gitme yolu olmadığına karar verdiğiniz için), sadece başka bir tane oluşturacak Validatorve IoCdoğru örneği almak için kapsayıcıyı kullanacaksınız. sizin config.


1

Birçok geliştirici için, Aptal Çirkin Denetleyicilere karşı Yağ modelleri tercih edilen yöntemdir.

Metindeki temel kavram

... Bu yüzden her zaman Model'in sadece veritabanı olmadığını unutmayın. Web servislerinden aldığınız veriler bile Model olarak ifade edilebilir! Evet, Atom bile besleniyor! Modele girişleri tıkayan çerçeveler neredeyse hiçbir zaman sadece yanlış anlamaları daha da kötüleştiren bu açıklamayı açıklamıyor.

ve

Görünüm yalnızca, kullanıcıların Model ile iletişim kurabilmeleri için bir kullanıcı arayüzü oluşturmak ve sunmakla ilgilenmelidir . Kontrolörler, UI girişlerini Model üzerindeki eylemlere dönüştüren ve Görünüm (ler) in sunulduğu Model (ler) den haberdar edilen her ne olursa olsun çıktıları geri aktaran orkestratörlerdir. Denetleyiciler, kullanıcı davranışını yalnızca Modellerdeki çağrılarla eşleştirmeleri anlamında tanımlamalı, ancak bu rolün ötesinde, Model içindeki diğer tüm uygulama mantığının da açık olması gerekir. Kontrolörler, sadece sahneyi ayarlayan ve işlerin organize bir şekilde çalışmasına izin veren minimum kodlu düşük yaratıklardır.

Görünüm yalnızca bir kullanıcı arayüzü oluşturmak ve sunmakla ilgilenmelidir, böylece kullanıcılar Model ile niyetlerini iletebilirler . Bir model saklanan verileri tanımlamalıdır, bu nedenle verilerin geçerliliğini kontrol etmekten de sorumlu olmalıdır.

Bir kişinin kaydını alırken, her kişinin ülke tarafından verilen benzersiz bir kimlik numarasına sahip olması gerekir. Bu kontrol (genellikle) UNIQUEveritabanı tarafından yapılan anahtar kontrolü ile yapılır . Verilen her kimlik numarası bazı kontrol adımlarını sağlamalıdır (tek basamaklı toplamlar çift basamaklı toplamlara eşit olmalıdır). Bu tip kontrollerModel

Kontrol veri topluyor Modelve geçmek Viewkullanıcı verileri vasıtasıyla toplanması, veya ters Viewve geçmek Model. Verilere erişim ve verilerin doğrulanması konusunda herhangi bir kısıtlama yapılmamalıdır Controller. Öyleydi Controllerçerez verileri toplar kim ve ne Modelgeçerli bir oturum veya kullanıcı başvurunun bu kısmı erişiminiz varsa hangi kontroller.

Viewkullanıcıdan veri toplayan veya kullanıcıya veri sunan kullanıcı arabirimidir. Basit kontroller View, kullanıcı giriş e-posta adresi gibi yapılabilir veya yapılamaz (bu nedenle Görünüm'de de yapılabilir) IMO.

Görünüm istemci tarafıdır ve kullanıcı girişini itmemelisiniz. Javascripts istemci tarafında çalışmayabilir, kullanıcı bunları değiştirmek veya tarayıcıyı kullanarak komut dosyasını devre dışı bırakmak için elle yazılmış komut dosyalarını kullanabilir. İstemci tarafı doğrulama komut dosyaları ayarlayabilirsiniz, ancak hiçbir zaman bunları itmemeli ve katman üzerinde gerçek denetimi yapmamalısınız Model.


Sadece vurgulamak gerekirse, yalnızca kullanıcı arayüzü ile ilgili olan görüş, bir tür doğrulama yapamayacağı anlamına gelmez - bir hata yaptıklarında kullanıcılara anında geri bildirim sağlamak aslında istemci tarafı komut dosyası oluşturmanın neden önemli bir parçasıdır yararlı, MVC bağlamında web sitelerine uygulanır.
Miles Rout

@MilesRout aslında demek istediğim Simple checks can be done by the View like the user input e-mail address or not belki o kadar net değil. Ama söylediğin benim için de geçerli, basit ve kolay kontroller görünümde kolayca yapılabilir.
FallenAngel

Seninle aynı fikirde değildim.
Miles Rout

0

Görünümler ff amaçları için doğrulama yapmalıdır:

  1. ) Kullanıcı arabirimi doğrulaması sunucunuzdaki veri trafiğini azaltabilir.
  2. ) sunucunuzda seyahat etmeden önce geçersiz verileri işler.
  3. ) daha yüksek bir güvenlik istiyorsanız, ön uç ve arka uç Doğrulama kombinasyonu daha iyidir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.