Sağlam bir PHP postback işleyicisi gelişmekte

4 Cevap php

Ben CMS tabanlı bir php geliştirme yapıyorum ve şu anda müşteriler için kullanışlı bir duruma yeniden yazıyorum. (Benim ilk sürümü sadece iç oldu ve biraz kıytırık karmaşa: P)

Olası her formdan Gönder düğmesini - Benim ilk versiyonunda, ben $ _POST değişkenlerin önemli sayıda varlığı için kontrol HandlePostBack adında bir function () vardı. Ayarlandığı, sonra uygun komutu idam olurdu.

Daha iyi bir yolu olup olmadığını merak ediyorum? Ben bir anahtarı göç ve her form dahil bir tek $ _POST değişkeni için bakın ve sonra komutu çalıştırmak olabilir. Kod minimum güzel olurdu, bu yüzden hızlı ve kolay bir sistem uzatabilirsiniz.

4 Cevap

Bu form sistem bir elden geçirilmesi biraz kullanabilirsiniz gibi geliyor bana. Neden bir sınıf olarak her biçimini temsil ve HandlePostBack işlev yöntem yapmak değil mi? Sonra teslim oldu formunu saptamak ve onu ele verebilir.

class ProfileForm extends Form {
    private $form_items = array(
        new FormItem('name', 'datatype', 'other_parameters'),
        new FormItem('another_name', 'datatype', 'other_parameters'),
        ...
    );

    public function render() {
        ...
    }

    public function handlePostData() {
        ...
    }
}

: Eğer gönderme düğmesi kimlikleri (<form_name>_submit, sen sunulması üzerinde böyle bir şey yapabileceği gibi bir şey için standart bir format kullanıyorsanız

foreach ($_POST as $key => $value) {
    if (substr($key, strlen($key) - 7) == '_submit') {
        $className = ucfirst(substr($key, 0, strlen($key) - 7)) . 'Form';
        $form = new $className();
        $form->handlePostBack();
    }
}

I would try to do it differently. Why do you need a central point for all your posts? This is really bad practice.

Bunun üzerine geliştirmek için merkezi bir nokta olan fikrine yeniden düşünülmesini deneyin ve ondan kurtulmak için çalışmayın.

Benzer davalarda genellikle gizli bir giriş 'form_action' kullanmak, bu yüzden (vb .. 'delete', 'düzenle', 'add' gibi) farklı eylemleri sağlamak için farklı teslim-düğmelerini kullanabilirsiniz

<input type="submit" onclick="assignAction(this.form, 'myItem_delete');"...>

Sonra sunucu tarafında i "_" tarafından eylem ayırabilirsiniz ve form sınıfı (yani basit bir anahtar için, ya da yansıması ...) tanımlayıcı olarak 1-st bölümünü kullanmak ve ikinci bölümü geri gönderme işlemesi gereken formu sınıfının hangi yöntemi diyor Veri. Ortak kod Bu gibi

$handler = explode('_', $_POST['form_action']);
$className = $handler[0]; // not secure, but simple enough for example
if (class_exists($className))
{
   $form = new $className();
   $method = $handler[1]; // again too simple
   if (method_exists($form, $method))
   {
      $form->$method($_POST, $other_params...);
   }
}

Tabii, örnek çok basit. Ama ortak bir fikir benim için, çalışıyor bulunuyor.

Bu tür bir şey yapmak için bir yolu sınıflar için rota istekleri olduğunu ve bu sınıf üzerinde $_SERVER['REQUEST_METHOD'] == 'POST' sonra) (yazı diyoruz yöntemi eğer. Bu form üzerinde eylem sonrası bir yöntem vardı bazı sınıfa doğrudan harita anlamına gelecektir.

// routed from URL: /users
class Users implements Resource
{
    public function post() 
    {
        // do your post here
    }

    public function get()
    {
        // do it for GET requests too
    }
}

Bu aslında daha önce ne yaptıklarını olarak aynı şey olsa da, size genel bir şekilde istekleri ile başa çıkabilirim ki biraz daha iyi kodu organize sağlayabilirsiniz:

$resource = $resourceFactory->getResource($url);
$method = strtolower($_SERVER['REQUEST_METHOD']);
$response = $resource->$method(); // eg: $resource->post();
$response->respond();

Bu fikir bir uzun yol alır recess framework bakabilirsiniz.