自己编写无依赖的PHP迷你MVC框架


最近捣鼓出了一款独具特色的超迷你 PHP MVC 框架——SharkyPHP。想要了解 MVC 框架实现原理的朋友,可以参考学习,希望能让大家能轻松理解 MVC 架构,在学习中少走弯路,快速上手。希望大家借助这个框架,能顺利走进 Web 开发的世界,逐步掌握其中的关键知识和技能。在此,也特别欢迎大家在学习使用过程中提出宝贵的建议呀。

一、框架目录结构

  1. public/:网站根目录,包含主入口文件index.php。
  2. sharky/:框架目录
    1. bootstrap.php:启动脚本。
    2. common.php:全局函数。
    3. constants.php:全局常量。
    4. core/:核心目录
      1. App.php:框架核心,负责初始化和启动应用程序。
      2. Collection.php:管理和操作数据集合。
      3. Config.php:配置管理,加载框架和站点配置文件。
      4. Container.php:简单容器,管理对象创建和依赖注入。
      5. Controller.php:控制器基类,处理业务逻辑。
      6. Database.php:数据库管理器,建立连接并执行数据库操作。
      7. SharkyException.php:异常类,统一处理异常和错误信息。
      8. Model.php:模型基类,与数据库交互。
      9. Router.php:路由管理,加载、注册和派遣路由。
    5. libs/:扩展库
      1. Cookie.php:管理 Cookie 操作。
      2. Session.php:管理 Session 操作。
      3. Template.php:模板引擎类,处理模板渲染。
    6. utils/:工具目录,如ArrayUtils.php提供多维数组操作工具。
    7. configs/:配置目录,存放核心、公共和多站点配置文件。
    8. errors/:错误模板文件夹,包含错误页面模板。

二、应用目录结构

1. 单站点模式

  1. app/:应用目录
    1. controllers/:控制器文件夹。
    2. models/:模型文件夹。
    3. views/:视图文件夹。
    4. routes/:路由目录,包含路由文件。
    5. config/:配置文件夹,自动覆盖sharky/下的配置。

2. 多站点模式

  1. app/:应用目录
    1. website/:等子目录,每个子目录包含各自的控制器、模型、视图等文件夹。

虽然没有依赖第三方包,但是需要用composer dump-autoload生成自动加载类的脚本。当然也可以自己写一个自动加载函数。

二、环境要求

  1. 支持Linux和Windows
  2. 目前尚不确定最低支持的PHP版本(建议8.0++)
  3. 确保安装了对应版本的 composer 包管理器
  4. 本框架不依赖其他第三方包
  5. 建议使用composer加载类

三、使用说明

  1. 下载安装

    建议使用 composer create-project sharky/sharky-php 命令安装,当然也可以克隆下面的仓库地址

    本框架不依赖其他第三方包,下载后需要运行 composer dump-autoload 生成自动加载类的脚本。

  2. 核心

    App 类位于 Sharky\Core 命名空间下,是框架的核心类,负责整个应用程序的初始化和启动流程。它通过依赖注入获取 RouterConfig 实例,完成站点配置的加载以及路由的派发等关键操作,从而驱动整个应用程序运行。

  3. 容器

    Container 类位于 Sharky\Core 命名空间下,是一个简单容器模块。它主要用于管理对象的创建和依赖注入,通过绑定抽象类型与具体实现,能够方便地创建类的实例,并自动解析和注入所需的依赖关系。

  4. 配置文件*

    Config 类位于 Sharky\Core 命名空间下,是框架中的配置管理器模块。它主要负责加载框架核心配置文件以及站点配置文件,并提供了根据指定路径获取配置值的功能。通过该类,可以方便地在应用程序中统一管理和获取各种配置信息。

    配置文件的加载

    所有需要复用的配置,以及多站点配置,必须放在 sharky/core/config/ 目录下面,框架会自动加载他们。

    所有的应用配置文件都应放在 project/app/config/ 目录下面,框架会自动加载他们。

    如果开启了多站点则是在 project/app/subsite/config/ 目录下面,同样框架会自动加载他们。

    project/
    └── app/
       └── config/
             ├── redis.php           // Redis配置文件
             ├── database.php        // 数据库配置文件
             └── ...
       
    
    配置文件的读取

    我们通过点分路径的方式读取配置,下面是一个示例

       // 首先我要从容器中获取一个config抽象类
       use Sharky\Core\Container;
       $container = Container::getInstance();
       $config = $container->make('config');
    
       // 然后用这个抽象类的get方法
       // get($path, $default = null)
       $isdebug = $config->get('config.isdebug', false);
    
  5. 控制器*

    Controller 类位于 Sharky\Core 命名空间下,是框架中的控制器模块,主要负责处理与业务逻辑相关的操作,如获取配置信息以及在出现错误时渲染相应的错误页面等。

  6. 模型*

    Database 类位于 Sharky\Core 命名空间下,是用于与数据库进行交互的核心类。它能够根据配置信息建立数据库连接(支持 mysqliPDO 两种连接方式),并提供了一系列方法来执行常见的数据库操作,如查询数据、执行SQL语句、获取表字段信息、管理事务以及获取最后插入记录的ID等。

    Mode 类位于 Sharky\Core 命名空间下,是一个用于与数据库进行交互的数据模型模块。它提供了一系列方法来执行常见的数据库操作,如查询、插入、更新、删除等,同时支持条件筛选、分组、分页以及对查询结果的处理等功能。通过该类,可以方便地在PHP应用程序中对数据库中的数据进行操作。

    Collection 类位于 Sharky\Core 命名空间下,实现了 Iterator 接口,主要用于对一组数据项进行管理和操作,提供了诸多便捷的方法来处理集合内的数据,比如添加元素、转换为数组、应用回调函数到每个元素以及遍历集合等操作。 Model 类的 select 方法查询结果会返回此类。

  7. 视图*

    Template 类位于 Sharky\Libs 命名空间下,是一个模板引擎类,它通过提供了一系列功能用于加载模板、处理模板中的变量、指令等,并进行渲染输出。主要特性包括支持多语言翻译、模板编译缓存以及多种常见的模板指令处理,如变量输出、继承、块定义、条件判断和循环等,模版语法类似于Twig。

  8. 会话*

    Session 类位于 Sharky\Libs 命名空间下,是一个用于管理Session操作的工具类,它提供了一系列便捷的方法来处理会话相关的操作,如启动会话、设置会话变量、获取会话变量值、检查变量是否存在、删除特定变量以及销毁整个会话等。

    Cookie 类位于 Sharky\Libs 命名空间下,是一个用于管理Cookie操作的工具类。它提供了一系列便捷的方法来设置、获取、检查和删除Cookie,使得在PHP应用程序中对Cookie的处理更加简单和规范化,遵循了良好的编程实践。

  9. 路由*

    Route 类位于 Sharky\Core 命名空间下,是框架中的路由管理模块,主要负责加载路由文件、注册路由及路由分组、格式化路径以及根据请求的方法和URI来派遣路由,从而确定要执行的相应控制器方法或回调函数。

  10. 伪静态*

    nginx请参考下方配置,具体以实际情况为准
    server {
          listen       80;
          server_name  example.com www.example.com;
          charset      utf-8;
    
          root    /var/www/example.com;
    
          location ~ / {
             index                  index.php;
             try_files $uri $uri/  /index.php?$query_string;
             client_max_body_size         50m; 
             client_body_buffer_size     256k; 
          }
    
          location = /index.php {
             fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
             fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
             include fastcgi_params;
             fastcgi_intercept_errors on;
          }
    }
    
    apache请参考下方配置,具体以实际情况为准

    确保LoadModule php_module modules/libphp.so等类似模块已启用

    <VirtualHost *:80>
       ServerName example.com
       ServerAlias www.example.com
       AddDefaultCharset UTF-8
       DocumentRoot /var/www/example.com
    
       <Directory "/var/www/example.com">
          DirectoryIndex index.php
          Options -Indexes
          RewriteEngine On
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} !-d
          RewriteRule ^(.*)$ /index.php?$1 [L,QSA]
          LimitRequestBody 50M
          MaxRequestWorkers 250
       </Directory>
    
       <FilesMatch "\.php$">
          SetHandler application/x-httpd-php
          ErrorDocument 404 /error.php
          ErrorDocument 500 /error.php
       </FilesMatch>
    </VirtualHost>
    

    或在 public/ 目录中创建 .htaccess 文件,配置 URL 重写规则来隐藏

    Options -Indexes
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php?$1 [L,QSA]
    
  11. 其他

    SharkyException 类位于 Sharky\Core 命名空间下,它继承自 \Exception 类,主要用于统一处理应用程序中的异常和错误信息。通过设置全局的异常处理函数和错误处理函数,能够根据配置文件中的调试模式设置来决定如何展示错误信息,并且在出现异常或错误时渲染相应的错误页面。

    Array_Utils 类位于 Sharky\Utils 命名空间下,是一个提供多维数组操作相关实用功能的工具类。它包含了用于深度合并数组、判断数组是否为关联数组、获取数组指定路径的值以及设置数组指定路径的值等方法,方便在处理多维数组时进行常见的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值