2012-06-04 3 views
0

Я использую php 5.3.3 и разрабатываю MVC webapp с использованием codeigniter. Код, который я пытаюсь реорганизовать в основном связка:refactor transaction handling code in php

$this->db->trans_start(); 
    // do some db updates 
    $this->db->update(...); 
    $this->db->update(...); 
$this->db->trans_complete(); 

if ($this->db->trans_status() == FALSE) { 
    $this->handle_db_error(); 
} 

поэтому у меня есть несколько из кода выше разброса вокруг в моих классах модели. Я хотел бы реорганизовать часть обработки транзакций из моделей и остаться СУХОЙ.

Я думал, что я мог бы с помощью закрытия, как следующее:

// in parent CI_Model class 
class MY_Model extends CI_Model { 
    public function txn_wrap($closure) { 
    $this->db->trans_start(); 
    $closure(); 
    $this->db->trans_complete(); 
    if ($this->db->trans_status() == FALSE) { 
     $this->handle_db_error(); 
    } 
    } 

// in child model class 

class Blog_model extends MY_Model { 
    protected $_table = 'app_blog'; 

    public function get($id) { 
    $instance = $this; 
    $closure = function() use($instance, $id) { 
     // do some db updates 
     $instance->db->update($instance->_table, array('title' => 'bla'), array('id' => $id)); 
    }; 
    $this->txn_wrap($closure); 
    } 

Это не работает и дает мне "PHP Fatal error: Using $this when not in object context". Поэтому я предполагаю, что использование этого использования не поддерживается в 5.3.

Теперь не удалось использовать закрытие, что еще я могу сделать?

UPDATE: теперь я получаю Undefined property: App_Blog::$_table где App_About является контроллер, который вызывает функцию Get() в Blog_model. Я пробовал function() use($instance, , $instance->_table, $id), но php жалуется на синтаксис .. Теперь эта закрывающая вещь не появляется, дайте мне столько преимуществ, сколько я думал.

спасибо!

ответ

1

Закрытие не является методом вашего модельного класса для детей, поэтому вы не можете получить доступ к экземпляру. Вам нужно будет предоставить его закрытия:

$instance = $this; 
$table = $this->_table; 
$update_db_closure = function() use ($instance, $table) { 
    // do some db updates 
    $instance->db->update($table, ...); 
    $instance->db->update($table, ...); 
}; 

Свойство $this->_table является protected, таким образом, вы не сможете получить к нему доступ внутри затвора, так что вы должны передать его копию.

+0

спасибо. пытался, но все равно получал такую ​​же ошибку. – perlwle

+0

Это невероятно странно, так как '$ this' не упоминается в закрытии _at all_. Вы уверены, что получаете такую ​​же ошибку? Где вы это понимаете? – lanzz

+0

хорошо. $ instance - это копия $ this. возможно, это тоже запрещено? Я обновил свой вопрос, но в основном просто заменил 'function()' на 'function() use ($ instance)' и добавил некоторый контекст. – perlwle