PHP tavsiye lütfen.

2 Cevap php

Ben yaklaşık bir yıl boyunca PHP ile çalışan oldum, ama ben bir hobi olarak yapmak. Ben bana tamamen yanlış yapıyor olabilir ne tavsiye vermek için bir öğretmen ya da bir akıl hocası olarak gidebilir kimseyi, ya da ne ben daha iyi yapabileceğini yok. Ben o yıl içinde epeyce farklı şeyler yaptık, bu yüzden kendimi tam bir çaylak düşünün olmaz.

Neyse, ben sadece bir çerçeve (Kohana) kullanmaya başladı, ve gerçekten orada öyle ki bu yüzden ben iyi bir şekilde şeyleri yapıyorum tamamen emin değilim orada çok öğreticiler.

Ben sadece dedi ne ilişkin bazı geribildirim almak nakletmek istiyorum bir kaç kod parçacıkları var.

Ilk olarak

User Controller

class User_Controller extends Template_Controller{

    public function register()
{
    // logged in users cant register
    if($this->logged_in)
    {
        url::redirect('user/profile');
    }

    // initially show an empty form
    $form = $errors = array
    (
        'username'      => '',
        'email'         => '',
        'password'      => '',
        'gender'        => '',
        'dob_month'     => '',
        'dob_day'       => '',
        'dob_year'      => '',
        'date_of_birth' => '',
        'captcha'       => '',
        'registration'  => ''
    );

    // check for a form submission
    if($this->input->post('register'))
    {
        // get the form
        $post = $this->input->post();

        // prepare the data for validation
        $post['date_of_birth'] = "{$post['dob_year']}-{$post['dob_month']}-{$post['dob_day']}";

        // create a new user
        $user = ORM::factory('user');

        // validate and register the user. 
        if($user->register($post, TRUE))
        {
            // SEND EMAIL

            // login using the collected data
            if(Auth::instance()->login($post->username, $post->password, TRUE))
            {
                // redirect the user to the profile page
                //url::redirect("user/profile/{$user->id}");
            }
        }

        // get validation errors and repopulate the form
        $form   = arr::overwrite($form,   $post->as_array());
        $errors = arr::overwrite($errors, $post->errors('registration_errors'));
    }

    // template variables
    $this->template->title = 'Sign Up';
    $this->template->body  = new View('layout_1');

    // layout variables
    $this->template->body->left  = new View('user/registration_form');
    $this->template->body->right = 'Right Side Content';

    // registration form variables
    $this->template->body->left->form    = $form;
    $this->template->body->left->errors  = $errors;
    $this->template->body->left->captcha = new Captcha('register');
}
}

Register Function within User_Model

class User_Model extends ORM{

    public function register(array& $user, $save = FALSE)
{
    $user = new Validation($user);

    // logged in users cant register
    if(Auth::instance()->logged_in())
    {
        $user->add_error('registration', 'logged_in');
        return FALSE;
    }

    // trim everything
    $user->pre_filter('trim')

        // everything is required
        ->add_rules('*', 'required')

        // username must be 5 - 30 alphanumeric characters and available
        ->add_rules('username', 'length[5,30]', 'valid::alpha_numeric', array($this, 'username_available'))

        // email must be valid format and available
        ->add_rules('email', 'valid::email', array($this, 'email_available'))

        // password must be 5 - 15 characters and alpha dash
        ->add_rules('password', 'length[5,15]', 'valid::alpha_dash')

        // gender must be either male or female. capitalize first letter
        ->add_rules('gender', array($this, 'valid_gender'))
        ->post_filter('ucfirst', 'gender')

        // dob must be a valid date, and user must be old enough.
        ->add_callbacks('date_of_birth', array($this, 'check_dob'))

        // captcha must be entered correctly.
        ->add_rules('captcha', 'Captcha::valid');

    // add the registration date
    $this->registration_date = date::unix2mysql();  // helper function transforms the current unix to mysql datetime format

    // validate the information. an ORM function.
    $result = parent::validate($user, $save);

    // was the user info valid?
    if($result === TRUE)
    {
        // was the user saved?
        if($save === TRUE)
        {
            // add a login role
            $this->add(ORM::factory('role', 'login'));
            $this->save();
        }
    }
    else
    {
        $user->add_error('registration', 'failed');
    }

    return $result;
}
}

Bilgisi doğrulanırken Çoğunlukla tüm modeller aynı biçimde izleyin.

Ben de hakkında geri bildirim seviniriz diğer bazı şeyler var, ama kimseyi mahçup etmek istemiyorum.

Thanks a lot for your time

EDIT: Özür dilerim, kullanıcı denetleyicisi ve model hem de gönderdiniz gerekir. Ben modelleri şişman nasıl olması gerektiği hakkında çok okuma oldum ve denetleyiciler sıska olmalıdır. Ben yerine kontrolör içerisinde bunu yaparken bilgi doğrulamak için model bir register fonksiyonunu yarattı neden Thats. Register fonksiyonu bir dizi alır, ama ben kullanıcı girişi almak ve hataları böylece bir doğrulama nesnesine bu diziyi dönüşür. Ben bu şekilde yapıldı Kohana üzerinde birkaç öğreticiler gördüm.

2 Cevap

Birincisi, ben kullanıcı modeli içine register () yöntemini koymak olmaz. Bir model veritabanındaki nesnenin bir temsilidir olabilir ve genellikle yalnızca "REZİL" yöntemleri (oluşturmak, almak, güncelleme, silme), alıcı ve ayarlayıcı yöntemleri ve modeli ile ilgili belki bazı statik yardımcı yöntemler içerir gerekir. Modelin içine register () yöntemini koyarak, modeli yapıyoruz bu bir kullanıcı eylemine bir tepki olduğundan, gerçekten, bir kullanıcı kontrolör tarafından yapılmalıdır sunum mantığı yok. Bir denetleyici, kullanıcı eylemleri kolları bu kullanıcı eylemleri doğrular, doğrulama başarılı ise o modeli günceller.

Sizin örnekte, kullanıcı yeni bir hesap oluşturmak için çalışıyor. O bir form doldurur ve tıklama gönderin. Formun POST eylem, bir kontrolörün yönteme işaret / kullanıcı gibi / kayıt, ve bu yöntem kullanıcı tarafından gönderilen form verilerini doğrulamak için Doğrulama kütüphane kullanacağız gerekir. Eğer bir kullanıcı modeli örnek oluşturmak gerektiğini veri başarıyla doğrular yalnızca, ne kullanıcı girişi bu modelin özelliklerini ayarlamak ve sonra veritabanına kaydetmek için modelin save () metodunu kullanabilirsiniz. Doğrulama başarısız olursa, kullanıcıya hata bildirmek ve henüz bir model oluşturmak için ayarlanmış geçerli bir veri yok çünkü size hiç bir kullanıcı modeli oluşturmak gerekmez.

Sonra, kullanıcı Yine oturum ise, bu kontrolör, değil model olmalıdır görmek için kontrol edilir. Bunun yanı sıra, kullanıcı ilk etapta bu kayıt sürecine almak mümkün olmamalıdır o zaten kullanıcı kayıt formu görünümü kullanıcı oturum açmış ve görmek için kontrol etmelisiniz oluşturur denetleyicisi yöntemi oturum ise o takdirde , o zaman başka bir sayfaya yönlendiriliyorsunuz edilmelidir. Kullanıcı kandırmaktan ve formu göndermek için yönetir bile (eski bir pencerede açık formu yaparken belki o başka bir pencere üzerinden kaydedilir), sizin kayıt yöntemi için kontrol etmelisiniz ki henüz $ kullanıcı Doğrulama nesnesi oluşturmak ilk değil.

Ben modeli kurmak dayalı bazı kafa karıştırıcı öğeler vardır kodunuzu görebilirsiniz. Örneğin, form veri olduğu sanırım, yönteme $ kullanıcı dizisi geçiyoruz. Ama tüm nesneler artık referans olarak geçirilen beri PHP5'ta gereksiz "referans geçmek" operatörü (&) kullanıyorsunuz. Ama sonra bir Doğrulama nesnesi olarak $ kullanıcıyı recasting ediyoruz. Eğer başka bir yerde $ kullanıcı doğrulama nesnesini kullanarak ve referans olarak kabul edilmesi gerektirir? Eğer öyleyse, bu işleme her denetleyicisi olması gerekiyor ve $ _POST değerleri yerine Doğrulama nesnenin etrafında geçmek zorunda denetleyicisi doğrudan kullanılabildiği gibi, bu mantık başka bir kusur.

Daha sonra, ($ tasarruf, $ user) parent :: validate ile kullanıcı bilgilerini doğrulayarak ediyoruz. Neden doğrulamak () yöntemi, statik bir yöntem olarak ebeveyn çağırdı ediliyor? Bu bir model ise, Kohana çekirdek Model sınıfını genişleten olmalı, ve "ebeveyn" referanslar Model sınıfı. Senin modeli Doğrulama sınıfını uzanan? Ayrıca, neden) yöntemi (doğrulama $ kullanıcı Doğrulama nesnesi içinde geçiyor? Bunu yaparken size özyinelemeye (önceki filtrelerden değişiklikleri yaptıktan sonra tekrar öğeleri doğrulamak için) yapmak gerekiyorsa gerekli, ancak özyineleme gerektiren bir şey yapmıyoruz gibi görünüyor. Sen $ kullanıcı doğrulama nesne üzerinde () validate çağrı olmalıdır:

$user->validate();

Herhangi bir argüman olmadan. Doğrulama hataları $ kullanıcı nesnesinin bir parçası haline gelecektir, böylece kullanarak hataları kontrol edebilirsiniz

$user->errors();

Kohana Eğer yöntem zincirleme kullanmak için izin verirken, son olarak, ben doğrulama için kuralları ve diğer öğeleri ayarlamak için uzun bir zincir kullanmak olmaz. Bu kafa karıştırıcı ve hata ayıklama zor olmasına neden olabilir. Kendi satırında bu her koyun ve $ kullanıcı doğrudan nesne üzerinde her gerçekleştirin.

Ben arazi yatıyordu kendi MVC ayrılık ne olduğundan emin öylesine im değil Kohanna bilmiyorum ama genelde ben bir denetleyici register bir eylem yapacak. I kod ile disagee ana şey modeli dahili kimlik doğrulama sistemine bağlanmış olmasıdır. Kimlik doğrulaması onay sınıf dışında yapılmalı ve denetim akışı karar dışında da yapılmalıdır, OR doğrulama denetiminin sonucu kendi iç işleyişinde kullanılmak üzere Model olarak kabul edilmelidir.

Genellikle i aşağıdaki pseudo kodu gibi bir şey yapacağım:

// in my controller class for User or whatever

public function registerAction()
{
   // get the form data from the request if its POST, ortherwise a blank array
   $userData = $this->getRequest('user', array(), 'POST');

   // create a user
   $user = new User($userData);

   if(Auth::instance()->logged_in())
   {
      // we are logged in add an error to the user object for use by the view
      $user->getValidator()->add_error('registration', 'logged_in');
   }
   elseif($user->is_valid())
   {
     // user data is valid, set the view with the success message
     $user->save();
     $this->setView('register_success');
   }

   /**
    * render the designated view, by default this would be the one containing the
    * registration form which displays errors if they exist - however if we success-
    * fully registered then the view with the success message we set above will be
    * displayed.
    */
   $this->render();
}