Модель MVC проблема и решение.

  • Автор темы Автор темы Vladex
  • Дата начала Дата начала

Vladex

Новичок
Для понятия модели MVC нашел простой source code на гитхабе
https://github.com/Jontyy/PHP-Basic-MVC-Framework
Вроде все понятно, но есть один момент - хочу внедрить в него работу с БД.
Но только в какое место и как это сделать.
В этом коде есть три папки, код из которых взаимодействует друг с другом:
У меня получилось добавить код для подключения к БД только в файл indexView.php
Но ведь это не правильно, по хорошему надо добавлять код в postsModel.php, но как это сделать в данном коде...ума не приложу.
 
добавлять надо в BaseModel.

метод, который возвращает соединение с базой. какой-нить getDb(), который возвращает PDO объект

соединение надо кэшировать в registry (там он есть) - то есть, если соединение уже есть, берем из registry, если нету, то создаем и кладем туда.
 
То есть к примеру у меня есть класс mysql.class.php
Я подключаю его в index.php так:
PHP:
require_once ("classes/mysql.class.php");
$sql = $db->query("SELECT * FROM userlist WHERE user_id  = '$user_id' ");
$row = $db->get_row($sql);
И использую так:
$row["firstname"]
Как мне этот код в basemodel добавить?
PHP:
	abstract class baseController{
		
		protected $_registry;

		protected $load;

		public function __construct(){
			$this->_registry = Registry::getInstance();
			$this->load = new Load;
		}
		abstract public function index();

		final public function __get($key){
			if($return = $this->_registry->$key){
				return $return;
			}
			return false;
		}	
	}
 
да можно и без регистри
PHP:
abstract class baseModel {

    protected static $pdoConnection = null;

    protected getDb() {
         if (self::$pdoConnection === null) {
            self::$pdoConnection = self::createPdoConnection();
         }
         return self::$pdoConnection;
    }

    protected static function createPdoConnection() {
         return new PDO.........
    }

}
 
А как туда это безобразие вставить?

PHP:
require_once ("classes/mysql.class.php");
$sql = $db->query("SELECT * FROM userlist WHERE user_id  = '$user_id' ");
$row = $db->get_row($sql);
Так.
PHP:
abstract class baseModel {

    protected static $db = null;

    protected getDb() { 
   require_once ("classes/mysql.class.php");
$sql = $db->query("SELECT * FROM userlist WHERE user_id  = '$user_id' ");
$row = $db->get_row($sql);
    }

}
 
fixxxer
лучше использовать static вместо self
 
так то да, но использование здесь static потребует дополнительных объяснений, как пользоваться lsb, которые судя по вопросам ТСа на данном этапе неуместны

в продакшен коде я уже и не помню когда писал именно self
 
Вот такая структура у меня на хосте.
pic_folder.JPG
Я хочу подключить библиотеку https://github.com/vasa-c/go-db/wiki/create
В файле baseModel.php такой код
PHP:
abstract class baseModel{
	protected $params;
	protected $db;
	public function __construct(){
			require(__DIR__.'/../goDB/autoload.php');
			\go\DB\autoloadRegister();
			$params = array(
				'host'     => 'localhost',
				'username' => 'username',
				'password' => 'password',
				'dbname'   => 'dbname,
				'charset'  => 'utf8',
				'_debug'   => true,
				'_prefix'  => '',
				'_adapter'  => 'mysql',
			);
			$db = go\DB\DB::create($params);
		}
	}
А в файле postModel.php такой код
PHP:
class postModel extends baseModel{		
		public function getAdd(){
				echo __DIR__;
				$db->query('INSERT INTO `users` SET `login`=?, `pass`=?, `email`=?', array($login, $pass, $email), 'id');
		}
Верно или надо по другому?
 
ты вообще что ли первый раз пишешь код где есть классы?
$db это локальная переменная метода
переменная объекта это $this->db
 
До меня долго доходит ООП:)
Обычно копипаст, или на примерах разбираюсь.
Если не сложно, с кодом подскажи в этом примере.
 
Если ты понимаешь общение на форуме, как спам в личку - то да, разумеется.
Если в состоянии соблюдать элементарные правила - никто тебя не гонит.
 
А я даже ему ответил, надеюсь, мизерный кусок кода ему подсобит)
 
Ребят спасибо!
Ругаться за спам это правильно.
В общем нашел ответ на свои вопросы
Файл baseModel.php такой
PHP:
abstract class baseModel{
    protected $params;
    protected $db;
    public function __construct(){
            require(__DIR__.'/../goDB/autoload.php');
            \go\DB\autoloadRegister();
            $this->params = array(
                'host'     => 'localhost',
                'username' => 'root',
                'password' => '',
                'dbname'   => 'demo',
                'charset'  => 'utf8',
                '_debug'   => true,
                '_prefix'  => '',
                '_adapter'  => 'mysql',
            );
            $this->db = go\DB\DB::create($this->params);
        }
    }
А postModel.php
PHP:
class postModel extends baseModel{
        public function getAdd(){
                $this->db->query('INSERT INTO `users` SET `login`=?, `pass`=?, `email`=?', array($login, $pass, $email), 'id');
        }
Сейчас заработало!
 
Сверху