MVC uygulama (Kohana / PHP) için CSV/Excel-->MySQL import manager yazıyorum.
Ben bir controller Tüm geçerli .csv
ve .xls
dosya ızgarasında görüntüler "index" (varsayılan) adında bir etkiye sahiptir "ImportManager" adında ki Belirli bir dizin ve ithalat için hazır bulunmaktadır. Kullanıcı daha sonra almak istediği dosyaları seçebilirsiniz.
.csv
dosya multiple veritabanı tabloları içine almak one veritabanı tablo ve .xls
dosyalara içe beri Ancak, ben bu {[işlemek için gerekli (4)]}. Dolayısıyla ben oluşturulan bir helper class "SmartImportFile
ki ben o zaman bu ask olsun o zaman her dosya .csv
veya .xls
olması ve göndermek için çağırdı (be they one or many) benim toplama bu dosyadan çalışma sayfalarını eklemek için akıllı "nesne. Burada PHP kodu benim eylem yöntem:
public function action_index()
{
$view = new View('backend/application/importmanager');
$smart_worksheets = array();
$raw_files = glob('/data/import/*.*');
if (count($raw_files) > 0)
{
foreach ($raw_files as $raw_file)
{
$smart_import_file = new Backend_Application_Smartimportfile($raw_file);
$smart_worksheets = $smart_import_file->add_smart_worksheets_to($smart_worksheets);
}
}
$view->set('smart_worksheets', $smart_worksheets);
$this->request->response = $view;
}
SmartImportFile sınıfı bu gibi görünüyor:
class Backend_Application_Smartimportfile
{
protected $file_name;
protected $file_extension;
protected $file_size;
protected $when_file_copied;
protected $file_name_without_extension;
protected $path_info;
protected $current_smart_worksheet = array();
protected $smart_worksheets = array();
public function __construct($file_name)
{
$this->file_name = $file_name;
$this->file_name_without_extension = current(explode('.', basename($this->file_name)));
$this->path_info = pathinfo($this->file_name);
$this->when_file_copied = date('Y-m-d H:i:s', filectime($this->file_name));
$this->file_extension = strtolower($this->path_info['extension']);
$this->file_extension = strtolower(pathinfo($this->file_name, PATHINFO_EXTENSION));
if(in_array($this->file_extension, array('csv','xls','xlsx')))
{
$this->current_smart_worksheet = array();
$this->process_file();
}
}
private function process_file()
{
$this->file_size = filesize($this->file_name);
if(in_array($this->file_extension, array('xls','xlsx')))
{
if($this->file_size < 4000000)
{
$this->process_all_worksheets_of_excel_file();
}
}
else if($this->file_extension == 'csv')
{
$this->process_csv_file();
}
}
private function process_all_worksheets_of_excel_file()
{
$worksheet_names = Import_Driver_Excel::get_worksheet_names_as_array($this->file_name);
if (count($worksheet_names) > 0)
{
foreach ($worksheet_names as $worksheet_name)
{
$this->current_smart_worksheet['name'] = basename($this->file_name).' ('.$worksheet_name.')';
$this->current_smart_worksheet['kind'] = strtoupper($this->file_extension);
$this->current_smart_worksheet['file_size'] = $this->file_size;
$this->current_smart_worksheet['when_file_copied'] = $this->when_file_copied;
$this->current_smart_worksheet['table_name'] = $this->file_name_without_extension.'__'.$worksheet_name;
$this->assign_database_table_fields();
$this->smart_worksheets[] = $this->current_smart_worksheet;
}
}
}
private function process_csv_file()
{
$this->current_smart_worksheet['name'] = basename($this->file_name);
$this->current_smart_worksheet['kind'] = strtoupper($this->file_extension);
$this->current_smart_worksheet['file_size'] = $this->file_size;
$this->current_smart_worksheet['when_file_copied'] = $this->when_file_copied;
$this->current_smart_worksheet['table_name'] = $this->file_name_without_extension;
$this->assign_database_table_fields();
$this->smart_worksheets[] = $this->current_smart_worksheet;
}
private function assign_database_table_fields()
{
$db = Database::instance('import_excel');
$sql = "SHOW TABLE STATUS WHERE name = '".$this->current_smart_worksheet['table_name']."'";
$result = $db->query(Database::SELECT, $sql, FALSE)->as_array();
if(count($result))
{
$when_table_created = $result[0]['Create_time'];
$when_file_copied_as_date = strtotime($this->when_file_copied);
$when_table_created_as_date = strtotime($when_table_created);
if($when_file_copied_as_date > $when_table_created_as_date)
{
$this->current_smart_worksheet['status'] = 'backend.application.import.status.needtoreimport';
}
else
{
$this->current_smart_worksheet['status'] = 'backend.application.import.status.isuptodate';
}
$this->current_smart_worksheet['when_table_created'] = $when_table_created;
}
else
{
$this->current_smart_worksheet['when_table_created'] = 'backend.application.import.status.tabledoesnotexist';
$this->current_smart_worksheet['status'] = 'backend.application.import.status.needtoimport';
}
}
public function add_smart_worksheets_to(Array $smart_worksheets = array())
{
return array_merge($smart_worksheets, $this->get_smart_worksheets());
}
public function get_smart_worksheets()
{
if ( ! is_array($this->smart_worksheets))
{
return array();
}
return $this->smart_worksheets;
}
}
A code review Ben denetleyicisi eylem yöntemi kendisi kod toplu tutmak için ama not to have a helper class Böyle daha iyi olabileceğini söyledi. Tartışma, bir denetleyici eylem koduna bakmak ve bunun yerine kendisi dışında harici yardımcı sınıflar diyoruz sahip ne yaptığını görmek mümkün olması gerektiği idi. I disagree. Benim münakaşa olduğunu:
- Eğer kod clearer, bu durumda olduğu gibi, bazı dosyalar one sayfasını veya many çalışma sayfalarını sahip olduğu gerçeğini uzak soyutlayan kılan bir yardımcı sınıf her zaman oluşturmanız gerekir diyelim ki, biz de sqlite dosyalar hatta directories onları dosyaları ile almak istediğiniz, eğer onlara, kolay ve gelecekteki uzantısı sağlar, bu sınıf soyutlama bu işlemek mümkün olacaktır güzel.
- geri denetleyicisi bu yardımcı sınıftan kod toplu taşıma bu özel eylem için mantıklı denetleyicisi internal variables oluşturmak için beni zorlayacaktır, ama ya içindeki diğer eylem yöntemleri için mantıklı olmayabilir kontrol ünitesi.
- Ben bu programlama olsaydı C# Ben bu yardımcı sınıf kılacak bir nested class, hangi kelimenin tam anlamıyla içinde ve sadece mevcut olan bir internal veri yapısı olacak kontrolör sınıfı, ama PHP yuvalanmış sınıfları izin vermez, çünkü ben "dışarıda" kod açık ve okunabilir kılan bir şekilde bu soyutlamayı yönetmenize yardımcı olmak için denetleyici bir sınıf aramak gerekir
Based on your experience of programming in the MVC pattern, should the above helper class be refactored back into the controller or not?