dv4mp1r3/mmvc

此包最新版本(dev-master)没有提供许可证信息。

快速实现MVC经验

dev-master 2024-04-13 22:19 UTC

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'
    ],
];