dv4mp1r3 / mmvc
快速实现MVC经验
Requires
- php: ^7.4
- ext-mcrypt: *
- ext-mysqli: *
- ext-openssl: *
- ext-pdo: *
- ext-pdo_mysql: *
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-13 23:07:47 UTC
README
描述
MMVC - 微型MVC。想法很简单:实现自己的MVC实现,最多有两层子类(即每个分支不超过3个类)。同时希望既能做Web,也能做CLI,能做ORM和查询构建器。
这个项目不是为了生产使用,而是为了积累经验。
这个项目是从一个测试题开始的,要求实现一个带有CRUD操作的单表MVC。为了学习目的,题目变得越来越复杂,于是就有了现在这个仓库中的内容。顺便说一句,还有一些基于这个项目的示例项目(例如,这里 和 这里),但它们只是为了展示在实验室条件下的可行性。即使在完全测试覆盖后,也不应该在多个项目中使用自制的框架,这是不好的,也不应该这样做。
内部结构是怎样的?所有请求都重定向到index.php,它初始化配置(实际上创建一个关联数组),然后控制权交给Router对象,其任务是初始化所需的控制器并调用所需的方法。
类层次结构
在Web应用程序中使用
假设我们想处理链接 /index.php?u=test-test
为此,需要在controllers目录下创建文件TestController.php,并在其中定义TestController类和actionTest方法
<?php
namespace myapplicationnamespace\controllers;
use mmvc\core\AccessChecker;
use mmvc\controllers\WebController;
class GuestController extends WebController
{
public function __construct() {
//здесь можно определить, кто к каким экшенам может получать доступ
$this->rules = [
'test' => [
AccessChecker::RULE_GRANTED => AccessChecker::USER_ALL,
],
];
parent::__construct();
}
public function actionTest() {
return 'hello, world!';
}
}
还可以包含URL重写,以便使用 /test/test 替代 /index.php?u=test-test(查看配置示例)
在控制台应用程序中使用
这和Web应用程序一样,只是需要继承自CliController类。AccessChecker类不支持控制台控制器。项目中有控制台控制器的示例: AccessChecker。示例控制台控制器在项目本身中: GenController。
配置示例
$config = [
// данные для работы с СУБД
// обязка над PDO
'db' =>
[
'driver' => RDBHelper::DB_TYPE_MYSQL,
'username' => '',
'password' => '',
'host' => 'localhost',
'schema' => 'mmvc_test',
],
// не используется
'users' => [
'admin' =>
[
'username' => 'admin',
'password' => '123',
'user_hash' => '',
],
],
// путь для сохранения логов
'logpath' => MMVC_ROOT_DIR . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR . 'main.log',
// временная зона по умолчанию
'timezone' => 'Etc/GMT-3',
// тип ссылок
'route' => \mmvc\core\routers\UrlFriendlyRouter::class,
// дефолтный маршрут
// используется, например, при обращении к корневому каталогу без передачи параметров
'defaultAction' => [
// название контроллера
'controller' => \al\controllers\IndexController::class,
// название метода для вызова после подгрузки
'action' => 'actionTest'
],
];