Доброго времени суток! Делаю свой движок с нуля (проект маленький, да и самому интересно).
Обычный MVC: роутер, запросы направляются на главный файл /index.php, там $router->run(), в котором вызывается контроллер и экшн (например, в site.ru/site/index управление передается в SiteController, actionIndex с параметрами GET, POST и FILES, если переданы).
Есть два варианта проектирования моделей и контроллеров, как мне кажется, оба приемлемы. Покажу на мини примере регистрации юзера.
Вариант 1. Создать приватные поля в модели, контроллер создаёт и использует объект модели для изменения состояния и передачи на вид объекта модели
Спойлер (Отобразить)
PHP:
скопировать код в буфер обмена
/* Модель */
<?PHP
class User
{
const PIN_LENGTH = 4;
private $id_user;
private $email;
private $password;
private $pin;
private $power;
private $pseudo_balance;
private $role;
function __construct()
{
//сложный конструктор, изменяющий состояние объекта в зависимости от кол-ва параметров, с которыми вызван (иначе сказано: несколько конструкторов преобразования)
}
public function register() //метод публичный нестатический, изменяет состояние объекта (присваивается id_user, вставленный в базу)
{
$hashedPassword = password_hash($this->password, PASSWORD_DEFAULT);
$sql = 'INSERT INTO User (email, password, pin)'
.' VALUES (:email, :password, :pin)';
$result = $GLOBALS['DBH']->prepare($sql);
$result->bindParam(':email', $this->email, PDO::PARAM_STR);
$result->bindParam(':password', $hashedPassword, PDO::PARAM_STR);
$result->bindParam(':pin', $this->pin, PDO::PARAM_STR);
if($result->execute())
{
$this->id_user = $GLOBALS['DBH']->lastInsertId();
return $this;
}
return false;
}
//ещё методы, проверка email, password и т.п.
}
/* Контроллер */
class UserController
{
public function actionSignup($params) //params - обезвреженый массив с данными GET, POST, FILES
{
$email = false;
$password = false;
$pin = false;
$submit = false;
extract($params['post'], EXTR_IF_EXISTS
);
$result = false;
{
$user = new User($email, $password, $pin);
$errors = array($user->checkEmail(), $user->checkPassword(), $user->checkPin()); //методы возвращают текст ошибок или пустую строку
{
$user->setUserData($email, $password, $pin)
$result = $user->register();
if($result === false)
{
$errors[] = 'Что-то пошло не так при записи в базу данных. Сообщите администратору';
}
}
}
// Подключаем вид
require_once(ROOT.'/views/user/signup.php');
return true;
}
. Модель содержит только статические методы, не содержит полей вообще, контроллер не создаёт объект и обращается через :: к методам модели