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

Vladex

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

fixxxer

К.О.
Партнер клуба
добавлять надо в BaseModel.

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

соединение надо кэшировать в registry (там он есть) - то есть, если соединение уже есть, берем из registry, если нету, то создаем и кладем туда.
 

Vladex

Новичок
То есть к примеру у меня есть класс 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;
		}	
	}
 

fixxxer

К.О.
Партнер клуба
да можно и без регистри
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.........
    }

}
 

Vladex

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

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);
    }

}
 

AmdY

Пью пиво
Команда форума
fixxxer
лучше использовать static вместо self
 

fixxxer

К.О.
Партнер клуба
так то да, но использование здесь static потребует дополнительных объяснений, как пользоваться lsb, которые судя по вопросам ТСа на данном этапе неуместны

в продакшен коде я уже и не помню когда писал именно self
 

Vladex

Новичок
Вот такая структура у меня на хосте.
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');
		}
Верно или надо по другому?
 

fixxxer

К.О.
Партнер клуба
ты вообще что ли первый раз пишешь код где есть классы?
$db это локальная переменная метода
переменная объекта это $this->db
 

Vladex

Новичок
До меня долго доходит ООП:)
Обычно копипаст, или на примерах разбираюсь.
Если не сложно, с кодом подскажи в этом примере.
 

Фанат

oncle terrible
Команда форума
Если ты понимаешь общение на форуме, как спам в личку - то да, разумеется.
Если в состоянии соблюдать элементарные правила - никто тебя не гонит.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
А я даже ему ответил, надеюсь, мизерный кусок кода ему подсобит)
 

Vladex

Новичок
Ребят спасибо!
Ругаться за спам это правильно.
В общем нашел ответ на свои вопросы
Файл 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');
        }
Сейчас заработало!
 
Сверху