Прежде всего ... Не ставьте автозагрузочный скрипт в механизм маршрутизации. Вы смешиваете обязанности. Вам лучше создать отдельный класс для этого на основе spl_autoload_register
.
Neeext .. не ставить сложные операции над конструктором. Это делает ваш код несколько непроверенным. Может быть, вы должны быть что-то вроде:
// you might want to replace $_GET with $_SERVER['QUERY_STRING'] later
$router = new Router( $_GET['url'] );
// where 'default' is the name of fallback controller
$controller_class = $router->get_controller( 'default' );
$method_name = $router->get_action( 'index' );
$model_factory = new ModelFactory( new PDO( ... ) );
$controller = new {$controller_class}( $model_factory );
$controller->{$method_name}();
Кроме того, вы должны изучить пространства имен php . Нет смысла заканчивать класс с ...Controller
, просто чтобы знать, где будет находиться класс.
Хорошо ... вернемся к модели.
Существует довольно распространенное заблуждение о моделях в сообществе веб-разработчиков (я обвиняю RoR в этом беспорядке). Модель в MVC - это не класс , а прикладной уровень, который содержит множество экземпляров. Большинство экземпляров принадлежат к одному из двух типов классов. Со следующими обязанностями:
Доменная логика :
Имеет дело со всеми вычислениями, расчетами и всеми специфическими для домена деталями. Объекты в этой группе не знают, где и как на самом деле хранятся данные. Они только манипулируют информацией.
Доступ к данным
Обычно состоит из объектов, которые соответствуют шаблону DataMapper (не путайте с ORM с тем же именем .. ничего общего). Отвечает за хранение данных из доменных объектов и их получение. Может быть в базе данных .. не может. Вот где будут ваши SQL-запросы.
В ситуации полуреального мира () это может выглядеть примерно так (связано с кодом выше):
class SomeController
{
// ... snip ...
protected $model_factory = null;
// ... snip ...
public function __construct( ModelFactory $factory )
{
$this->model_factory = $factory;
}
// ... snip ...
public function action_foobar()
{
$user = $this->model_factory->build_object( 'User' );
$mapper = $this->model_factory->build_mapper( 'User' );
$user->set_id(42);
$mapper->fetch($user);
if ( $user->hasWarning() )
{
$user->set_status( 'locked' );
}
$mapper->store( $user );
}
// ... snip ...
}
Как видите, нет указаний на то, как были сохранены данные. Не имеет значения, была ли учетная запись новой или уже существующей.
Некоторые материалы, которые вам могут пригодиться
Видео
Книга: