в MVC улучшения - 0 - to_do


Здесь представлены 3 файлы, составляющие моего MVC. Два просматривать файлы, содержащие HTML-код не включены.

Любые советы о том, как улучшить это, поэтому он пригоден для других.

Она должна быть легкая альтернатива для тяжелых библиотек.

Спасибо!

<?php // index.php
  /*
  When the user hits reload button on browser
  */
  include 'arche_control.php'; 
  $controller = new controller_reload();
  $controller->reload();
?>


<?php  //model.php
  /* 
     Used to decouple super global variables
     Gateway file for Ajax and File Uploads
  */
  include 'arche_control.php'; 
  if(isset($_FILES['ufile']['tmp_name'])) 
    {
    $controller = new controller_file();
    }
  elseif(isset($_POST['a']))
    {
    $controller = new controller_ajax($_POST['a']);
    }
?>

<?php //  mvc.php

/****************************************************************
Light MVC Framework - copyright 2011 ArcdeV, Inc.
Note the modules are broken up using commented sections not files
as is common
*****************************************************************/

session::start();

/****************************************************************
CREDENTIALS
*****************************************************************/

define('DB_USER', 'archemar_1');
define('DB_PASS', 'A*99');
define('DB_HOST', 'localhost');
define('DB_DATABASE', 'archemar_1');

/****************************************************************
MODEL CLASSES
one_db, database, post, session, validate, signin, signup, 
signout, bookmark, tweet, table_maintain, upload, import
****************************************************************/

/*one_db*/

class one_db 
  { 
  protected static $db; 
  private function __construct() 
    { 
    self::$db=new mysqli(DB_HOST, DB_USER, DB_PASS, DB_DATABASE);
    } 
  public static function get() 
    { 
    if(self::$db==NULL) 
      { 
      new self(); 
      } 
    return self::$db; 
    } 
  }

/*database*/

class database extends one_db      
  {
  function __construct()  
    {
    one_db::get();
    }
  public function query($query) 
    {
    return one_db::$db->query($query);
    }
  private function ref_arr(&$arr)  // will need this later. 
    { 
    $refs = array(); 
    foreach($arr as $key => $value) 
      {  
      $refs[$key] = &$arr[$key];
      } 
    return $refs;
    }   
  }

/*post*/

class post extends database
  {
  public $_protected_arr=array();
  protected function __construct()
    {
    parent::__construct();
    $this->protect();
    }
  protected function protect()
    {
    foreach($_POST as $key=>$value)
      {
      /* magic_quotes issue
      $this->_protected_arr[$key]=mysqli_real_escape_string($value);
      */
      $this->_protected_arr[$key]=$value;
      }
    }
  }

/*session*/

class session
  {
  public static function start()
    {
    session_start();
    }
  public static function activate($a,$b)
    {
    $_SESSION['email']=$a;
    $_SESSION['name']=$b;
    }
  public static function deactivate()
    {
    unset($_SESSION['email']);
    unset($_SESSION['name']);
    }
  public static function active()
    {
    return isset($_SESSION['email']);
    }
  public static function finish()
    {
    $_SESSION=array();
    if(session_id() != "" || isset($_COOKIE[session_name()]))
      {
      setcookie(session_name(),'',time()-2592000,'/');
      }
    session_destroy();
    }
  }

/*validate*/

class validate
  {
  private $input;
  function __construct($input_arg)
    {
    $this->input=$input_arg;
    } 
  function empty_user()    
    {
    if((int)!in_array('',$this->input,TRUE)) return 1;
    return 0; 
    }
  function name()          
    {
    if(preg_match('/^[a-zA-Z-\.\s]{1,60}$/',$this->input['name'])) return 1;
    return 0; 
    }
  function email()
    {
    if(preg_match('/^[a-zA-Z0-9._s-]{1,256}+@[a-zA-Z0-9.-]+\.[a-zA-Z]{1,4}$/',$this->input['email'])) return 1;
    return 0; 
    }
  function pass()
    {
    if(preg_match('/.{6,40}/',$this->input['pass'])) return 1;
    return 0;
    }
  }

/*signin*/

class signin extends post
  {
  function __construct()
    {
    parent::__construct();
    $this->invoke();
    }
  function invoke()
    {
    $obj=new validate($this->_protected_arr);
    if($obj->empty_user())
      {
      if($obj->email())
        {
        if($obj->pass())
          {
          if(self::validate())
            {
            self::activate_session();
            $control=new controller_control();
            $control->send('pass');
            }
          else
            {
            new view_message('validate');
            }
          }
        else
          {
          new view_message('pass');
          }
        }
      else
        {
        new view_message('email');
        }
      }
    else
      {
      new view_message('empty');
      }         
    }
  private function validate()
    {
    $email=$this->_protected_arr['email'];
    $pass=$this->_protected_arr['pass'];    
    $query="SELECT pass FROM cr WHERE email='$email'";
    $row=mysqli_fetch_row(database::query($query));    
    $pass=crypt($pass, $row[0]);
    $query="SELECT email,pass FROM cr WHERE email='$email' AND pass='$pass'";      
    if(mysqli_num_rows(database::query($query))!=0) 
      {
      return 1;
      }
    else
      {
      return 0;
      }
    }
  private function activate_session()
    {
    $email=$this->_protected_arr['email'];
    $res_arr=mysqli_fetch_assoc(database::query("SELECT flname FROM cr WHERE email='$email'"));
    $flname=$res_arr['flname'];
    session::activate($email,$flname);
    }
  }

/*signup*/

class signup extends post
  { 
  function __construct()
    {
    parent::__construct();
    $this->invoke();
    }
  private function invoke()
    {
    $obj=new validate($this->_protected_arr);
    if($obj->empty_user())
      {
      if($obj->name())
        {
        if($obj->email())
          {
          if($obj->pass())
            {
            if(self::taken())
              {
              self::insert_data();
              $control=new controller_control();
              $control->send('pass');
              }
            else
              {
              new view_message('taken');
              }
            }
          else
            {
            new view_message('pass');
            }
          }
        else
          {
          new view_message('email');
          }
        }
      else
        {
        new view_message('name');
        }
      }
    else
      {
      new view_message('empty');
      }         
    }    
  private function taken()
    {
    $email=$this->_protected_arr['email'];
    $query="SELECT * FROM cr WHERE email='$email'";
    if(mysqli_num_rows(database::query($query)))
      {
      return 0;
      }
    else
      {
      return 1;
      }
    }
  private function insert_data()
    {
    $flname=$this->_protected_arr['name'];
    $email=$this->_protected_arr['email'];
    $pass=crypt($this->_protected_arr['pass']);
    database::query("INSERT INTO cr VALUES ('$flname', '$email', '$pass')"); 
    database::query("INSERT INTO bo VALUES ('Facebook','http://www.facebook.com','','$email')"); 
    session::activate($email, $flname);
    }
  }

/*signout*/

class signout
  { 
  function __construct()
    {
    session::finish();
    }
  }

/*bookmark*/

class bookmark extends post 
  {
  function __construct($type)
    {
    parent::__construct();
    if($type=='insert')
      {
      database::query("INSERT INTO bo VALUES ('{$this->_protected_arr["f3a"]}', '{$this->_protected_arr["f3b"]}', '', '$_SESSION[email]')"); 
      $control=new controller_control();
      $control->send('pass');
      }
    else if($type=='delete')
      {
      database::query("DELETE FROM bo WHERE name='{$this->_protected_arr[a1]}' AND email='$_SESSION[email]' LIMIT 1");
      $control=new controller_control();
      $control->send('pass');
      }
    }
  }

/*tweet*/

class tweet extends post
  {
  private $time;
  function __construct()
    {
    $this->time=time();
    parent::__construct();
    $this->invoke();
    }
  private function invoke()
    {
    $this->insert();
    $this->send_aml();    
    }
  private function insert()
    {
    $email=$_SESSION['email'];
    $flname=$_SESSION['name'];
    $message=$this->_protected_arr['f4b'];
    database::query("INSERT INTO tw VALUES ('$this->time','$flname','$message','$email')");        
    }
  private function send_aml()
    {
    $query_return = database::query("SELECT * FROM tw ORDER BY time DESC LIMIT 7");    
    $control=new controller_control(); 
    $aml_string = $control->add('pass');    
    $iter=0;    
    while($a=mysqli_fetch_assoc($query_return))
      {
      if($iter!=0)
        {
        $aml_string = $aml_string . "||";
        }
      $iter++;
      $aml_string = $aml_string . $a['email'] . "|" .  $a['fname'] . "|" . $this->time . "|" . $a['time'] . "|" . $a['message'];      
      }
    echo $aml_string;
    }
  }

/*table_maintain*/

class table_maintain extends database
  {
   public function delete($table_type)
    {
    database::query("DROP TABLE $table_type");
    echo "Table '$table_type' deleted \n";
    }
  private function create($name, $query)
    {
    database::query("CREATE TABLE $name($query)");
    echo "Table '$name' created <br>";
    }  
  public function make($type)
    {
    switch ($type) 
      {
      case "te":
        $this->create('te', 'id INT NOT NULL AUTO_INCREMENT, address VARCHAR(60), date DATE, PRIMARY KEY(id)');
        break;
      case "cr":
        self::create('cr', 'flname VARCHAR(60), email VARCHAR(321), pass VARCHAR(40), INDEX(email(6))');
        break;
      case "bo":
        self::create('bo', 'name VARCHAR(64), url VARCHAR(256), dom VARCHAR(256), email VARCHAR(64)');
        break;
      case "tw":
        self::create('tw', 'time INT, fname VARCHAR(32), message VARCHAR(128), email VARCHAR(64)');
        break;
      case "co":
        self::create('co', 'name VARCHAR(32), number VARCHAR(32), email VARCHAR(32), address VARCHAR(32), web VARCHAR(32), web VARCHAR(32), notes VARCHAR(128), tag VARCHAR(3)');
        break;
      }
    }
  }

/*upload*/

class upload
  {
  private $w, $h, $tw, $th, $max1=50, $max2=20;
  private $path1="images/generic_large.jpg", $path2="images/generic_small.jpg";
  private $src=NULL;
  function __construct()
    {
    $this->invoke();
    }
  private function invoke()
    {
    $email=$_SESSION['email'];
    $path3="pictures/$email.jpg";
    $path4="pictures/$email-1.jpg";
    if(move_uploaded_file($_FILES['ufile']['tmp_name'], $path3))
      {
      if($this->get_image($path3))
        {
        list($this->w,$this->h)=getimagesize($path3);
        $this->tw=$this->w;$this->th=$this->h;
        $this->resize_move($this->max1,$path3);        
        $this->resize_move($this->max2,$path4);        
        imagedestroy($this->src);
        }
      }
    else
      {
      copy($this->path1, $path3);
      copy($this->path2, $path4);
      }
    }
  private function get_image($path)
    {
    $a=TRUE;
    switch($_FILES['ufile']['type'])
      {
      case "image/gif":   
        $this->src = imagecreatefromgif($path); 
        break;
      case "image/jpeg":    
      case "image/pjpeg":   
        $this->src = imagecreatefromjpeg($path); 
        break;
      case "image/png":   
        $this->src = imagecreatefrompng($path); 
        break;
      default:          
        $a = FALSE; 
        break;
      }
    return $a;

  $type_creators = array( 
    'image/gif' => 'imagecreatefromgif', 
    'image/pjpeg' => 'imagecreatefromjpeg', 
    'image/jpeg' => 'imagecreatefromjpeg', 
    'image/png' => 'imagecreatefrompng');

  $img_type = $_FILES['ufile']['type']; 

  if(array_key_exists($img_type, $type_creators)) 
    { 
    $this->src = $type_creators[$img_type]($path); 
    return true; 
    } 
  return false; 
    }
  private function resize_move($max, $path)
    {
    if($this->w > $this->h && $max < $this->w)  
      {
      $this->th = $max / $this->w * $this->h;   
      $this->tw = $max;
      }  
    elseif($this->h > $this->w && $ax < $this->h)
      {
      $this->tw = $max / $this->h * $this->w;
      $this->th = $max;
      } 
    elseif($max < $this->w)
      {
      $this->tw=$this->th=$max;
      }
    $a = imagecreatetruecolor($this->tw, $this->th);
    imagecopyresampled($a, $this->src, 0, 0, 0, 0, $this->tw, $this->th, $this->w, $this->h);           
    imagejpeg($a, $path);
    imagedestroy($a);   
    }
  }

/*import*/

class import extends database
  {
  protected function __construct($file_name)
    {
    parent::__construct();
    $this->ie($file_name);
    }
  function ie($file_name)
    {
    $lines = file('ie.htm');
    foreach ($lines as $line) 
      { 
      if(preg_match("/(https?:\/\/.+?)\"(.+)\" >(.+)\./", "$line", $matches))
        {
        //('bo', $matches[3], $matches[1] );
        }
      }
    }
  }

/****************************************************************
VIEW MODULE
view, view_database, view_message
view_arche_1 (external), view_arche_2 (external) - these are 
  primarily html files 
****************************************************************/

/*view*/

class view extends database
  {
  }

/*view_db*/

class view_db extends view
  {
  function __construct($type)
    {
    parent::__construct();    
    $this->invoke($type);
    }
  private function invoke($type)
    {
    switch ($type) 
      {
      case "bookmarks":
        $this->html_bookmarks();
        break;
      case "tweets":
        $this->html_tweets();
        break;
      default:
        throw new Exception('Invalid View Type');
        break;
      }
    }
  private function html_bookmarks()
    {
    $email = $_SESSION['email'];
    $query_return = database::query("SELECT * FROM bo  WHERE email='$email' ORDER BY name ASC");
    $html_string='';
    while ($ass_array = mysqli_fetch_assoc($query_return))
      {
      $fav=$this->favicon($ass_array['url']);
      $html_string = $html_string . "<img name='bo_im' class='c' src='$fav' onerror='i_bm_err(this)'><a target='_blank' name='a1' class='b' href = $ass_array[url]>$ass_array[name]</a>";
      }      
    echo $html_string;
    } 
  private function html_tweets() 
    {
    $query_return = database::query("SELECT * FROM tw ORDER BY time DESC LIMIT 7");
    $time = time();
    $html_string='';
    while ($a = mysqli_fetch_assoc($query_return))
      {
      $html_string = $html_string . "<div class='Bb2b'><img class='a' src='pictures/$a[email].jpg' alt=''/><a class='a' href='javascript:void(0)'>$a[fname] posted <script type='text/javascript'>document.write(v0($time,$a[time]))</script></a><br/><p class='c'>$a[message]</p></div>";
      }
    echo $html_string;
    }
  private function favicon($url)     
    {    
    $pieces = parse_url($url);    
    $domain = isset($pieces['host']) ? $pieces['host'] : '';    
    if(preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs))       
      {     
      return $pieces['scheme'] . '://www.' . $regs['domain'] . '/favicon.ico';    
      }    
    return false;
    }
  }

class view_message extends view
  {
  function __construct($type)
    {    
    $this->invoke($type);
    }
  private function invoke($type)
    {
    $this->message($type);
    }   
  private function message($type)
    {
    $type_message = array( 
    'empty' => '<si_f>Please complete all fields.', 
    'name'=> '<su_f>Only letters or dashes for the name field.',
    'email' => '<si_f>Please enter a valid email.',  
    'taken' => '<si_f>Sorry that email is taken.', 
    'pass' => '<si_f>Please enter a valid password, 6-40 characters.',
    'validate' => '<si_f>Please contact <a class="d" href="mailto:support@archemarks.com">support</a> to reset your password.');    
    echo $type_message[$type];
    }
  }

/****************************************************************
CONTROLLER MODULE - controller_file, controller_ajax, 
controller_reload, controller_database, controller_control
****************************************************************/

/*controller_reload*/

class controller_reload
  {
  public $model;
  public function __construct()
    {
    }
  public function reload()
    {
    if(session::active())
      {
      include 'arche_view_2.php';
      }
    else
      {
      include 'arche_view_1.php';
      }
    }
  public function reload_header()
    {
    $uri = 'http://' . $_SERVER['HTTP_HOST'] ;
    header('Location: '.$uri);
    }
  }

/*controller_ajax*/

class controller_ajax
  {
  public $model;
  function __construct($type)
    {
    $this->invoke($type);
    }
  function invoke($type)
    {
    if(isset($type))
      { 
      switch($type) 
        {
          case '0': 
            $this->model = new signin(); 
            break; 
          case '1':
            $this->model = new signup(); 
            break; 
          case '2':
            $this->model = new signout();         
            $controller=new controller_reload();
            $controller->reload_header();
            break; 
          case '3': 
            $this->model = new bookmark('insert');
            break; 
          case '3a': 
            $this->model = new bookmark('delete'); 
            break; 
          case '4': 
            $this->model = new tweet(); 
            break;
          default:
            throw new Exception('Invalid Model Type');          
            break;
        }
      }
    }
  }  

/*controller_database*/

class controller_database
  {
  private $model;
  function __construct($type)
    {
    $this->invoke($type);   
    }
  function invoke($type)
    {
    switch($type) 
      {
      case 'bookmarks': 
        $this->model = new view_db($type); 
        break; 
      case 'tweets':
        $this->model = new view_db($type); 
        break; 
      default:
        throw new Exception('Invalid View Type');           
        break;
      }
    }
  }

/*controller_file*/

class controller_file
  {
  public $model;
  function __construct()
    {
    $this->invoke();
    }
  function invoke()
    {
    $this->model=new upload();
    $controller=new controller_reload();
    $controller->reload_header();
    }
  }

/*controller_control*/

class controller_control
  {
  private  $type_array = array( 
    'pass' => '<xx_p>', 
    'fail' => '<xx_f>');
  function add($type)
    {
    return $this->type_array[$type];
    }
  function send($type)
    {
    echo $this->type_array[$type];
    }
  }

?>


322
1
php
задан 1 ноября 2011 в 03:11 Источник Поделиться
Комментарии
2 ответа


  • Этот код, кажется, требует изменений, основываясь на том, волшебные кавычки включены. Кроме того, в настоящее время предполагая, что волшебные кавычки будут включены. Следует поощрять устранение волшебные кавычки с этой земли, не в зависимости от них.

  • Это довольно трудно расшифровать код содержит никаких замечаний. Я обычно против много замечаний, но я еще больше против кода, чьи намерения не являются самоочевидными. Выбрать один или другой. (Позвольте мне отдать здесь свой голос в пользу того, что делает код достаточно читаемый, что не нуждается в комментариях.)

  • Кто тебе сказал, два-гольца имена таблиц приемлемо? Имена должны быть описательными. Вы, кажется, чтобы быть в курсе, что там нет два-символ ограничения на длину имени; использовать это, чтобы облегчить жизнь бедным чмо, которое заканчивается тем, что работал на этом коде (который может быть в 6 месяцев). Мне не нужно в документации посмотреть ваши вещи и увидеть, что она делает. Особенно учитывая, что вы не предоставили ни одного. :Р

  • А пост - это базы данных? Нет. А посмотреть в базе данных? Еще сильнее, нет. (Вы утверждали, что это в MVC, вы должны знать, что в MVC, взгляды должны даже иметь прямой доступ к БД. Это работа модели.) Использовать наследование, чтобы сказать что-то "- это" чего-то другого, не только потому, что это удобно, чтобы сказать родителю:: метод__Construct() , чтобы создать БД.

  • Кстати, это другое дело. Работа конструктора заключается в создании объекта. Ни больше, ни меньше. новое что-то() должен вернуть мне кое-что, что я буду использовать. Ни больше, ни меньше. Она не должна иметь побочных эффектов помимо создания экземпляра на вопрос. Установка какая-то магия глобальной 3 слоя в дереве наследования? Ада нет. Вы никогда не должны иметь голый новый();; если вы хотите, чтобы объект, то вы должны использовать его (хранить вызов функций на нем и т. д.). Если вы не, затем бросить ругая конструкторов. Черт, если все будет инит выставление базе во всяком случае, тогда просто скажи: базы данных::получить() на начало код и избавить себя все ненужное наследство.

  • Что это за странные теги в строках в view_message::сообщение, controller_control::$type_array, ? Вы знаете, что это не действительный HTML. Если это предназначается, чтобы быть интерпретированы JS или что-то, использовать стандартный формат, например JSON.

  • Относительно, ваши отступы и схему именования сосать. Это почти универсальное соглашение, что имена классов начинаются с заглавной буквы. И я видел точно двух людей в моей жизни, который выравнивает брекеты, как это-ни от кого я никогда не позволю коснуться любой код, который я когда-нибудь буду работать. Он всегда смотрит на меня, как кто-то потерял свои подтяжки. Погугли "PHP кодинг стиль" и читайте на конвенциях, почти все рекомендуют 4 места отступы, и К&Р, OTBS, или Оллман стиль брекеты. Если вы намерены выпустить этот код в мире, то лучше придерживаться общепринятых условностей. (Единственный плюс, по крайней мере, ты последователен об этом.)

6
ответ дан 7 ноября 2011 в 06:11 Источник Поделиться

Некоторые случайные мысли:

1, Вы должны поставить ваше подключение к базе данных информации (и другие параметры) в config.php.

2, используя наследование, чтобы поделиться код, как правило, не очень хорошая идея: каковы недостатки использования наследование как способ повторного использования кода?

3, вместо магическое число 2592000 использовать именованную константу.

4, я напишу вызова() метод следующим образом:

function invoke() {
$obj=new validate($this->_protected_arr);
if(!$obj->empty_user()) {
new view_message('empty');
return;
}

if(!$obj->email()) {
new view_message('email');
return;
}

if(!$obj->pass()) {
new view_message('pass');
return;
}
...
}

Это гораздо легче читать.

2
ответ дан 6 ноября 2011 в 11:11 Источник Поделиться