最近捣鼓出了一款独具特色的超迷你 PHP MVC 框架——SharkyPHP。想要了解 MVC 框架实现原理的朋友,可以参考学习,希望能让大家能轻松理解 MVC 架构,在学习中少走弯路,快速上手。希望大家借助这个框架,能顺利走进 Web 开发的世界,逐步掌握其中的关键知识和技能。在此,也特别欢迎大家在学习使用过程中提出宝贵的建议呀。
一、框架目录结构
public/
:网站根目录,包含主入口文件index.php。sharky/
:框架目录bootstrap.php
:启动脚本。common.php
:全局函数。constants.php
:全局常量。core/
:核心目录App.php
:框架核心,负责初始化和启动应用程序。Collection.php
:管理和操作数据集合。Config.php
:配置管理,加载框架和站点配置文件。Container.php
:简单容器,管理对象创建和依赖注入。Controller.php
:控制器基类,处理业务逻辑。Database.php
:数据库管理器,建立连接并执行数据库操作。SharkyException.php
:异常类,统一处理异常和错误信息。Model.php
:模型基类,与数据库交互。Router.php
:路由管理,加载、注册和派遣路由。
libs/
:扩展库Cookie.php
:管理 Cookie 操作。Session.php
:管理 Session 操作。Template.php
:模板引擎类,处理模板渲染。
utils/
:工具目录,如ArrayUtils.php提供多维数组操作工具。configs/
:配置目录,存放核心、公共和多站点配置文件。errors/
:错误模板文件夹,包含错误页面模板。
二、应用目录结构
1. 单站点模式
app/
:应用目录controllers/
:控制器文件夹。models/
:模型文件夹。views/
:视图文件夹。routes/
:路由目录,包含路由文件。config/
:配置文件夹,自动覆盖sharky/下的配置。
2. 多站点模式
app/
:应用目录website/
:等子目录,每个子目录包含各自的控制器、模型、视图等文件夹。
虽然没有依赖第三方包,但是需要用composer dump-autoload
生成自动加载类的脚本。当然也可以自己写一个自动加载函数。
二、环境要求
- 支持Linux和Windows
- 目前尚不确定最低支持的PHP版本(建议8.0++)
- 确保安装了对应版本的
composer
包管理器 - 本框架不依赖其他第三方包
- 建议使用composer加载类
三、使用说明
-
下载安装
建议使用
composer create-project sharky/sharky-php
命令安装,当然也可以克隆下面的仓库地址-
Gitee :https://gitee.com/bytesharky/SharkyPHP (可能更新不同步)
本框架不依赖其他第三方包,下载后需要运行
composer dump-autoload
生成自动加载类的脚本。 -
核心
App
类位于Sharky\Core
命名空间下,是框架的核心类,负责整个应用程序的初始化和启动流程。它通过依赖注入获取Router
和Config
实例,完成站点配置的加载以及路由的派发等关键操作,从而驱动整个应用程序运行。 -
容器
Container
类位于Sharky\Core
命名空间下,是一个简单容器模块。它主要用于管理对象的创建和依赖注入,通过绑定抽象类型与具体实现,能够方便地创建类的实例,并自动解析和注入所需的依赖关系。 -
配置文件*
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);
-
控制器*
Controller
类位于Sharky\Core
命名空间下,是框架中的控制器模块,主要负责处理与业务逻辑相关的操作,如获取配置信息以及在出现错误时渲染相应的错误页面等。 -
模型*
Database
类位于Sharky\Core
命名空间下,是用于与数据库进行交互的核心类。它能够根据配置信息建立数据库连接(支持mysqli
和PDO
两种连接方式),并提供了一系列方法来执行常见的数据库操作,如查询数据、执行SQL语句、获取表字段信息、管理事务以及获取最后插入记录的ID等。Mode
类位于Sharky\Core
命名空间下,是一个用于与数据库进行交互的数据模型模块。它提供了一系列方法来执行常见的数据库操作,如查询、插入、更新、删除等,同时支持条件筛选、分组、分页以及对查询结果的处理等功能。通过该类,可以方便地在PHP应用程序中对数据库中的数据进行操作。Collection
类位于Sharky\Core
命名空间下,实现了Iterator
接口,主要用于对一组数据项进行管理和操作,提供了诸多便捷的方法来处理集合内的数据,比如添加元素、转换为数组、应用回调函数到每个元素以及遍历集合等操作。Model
类的select
方法查询结果会返回此类。 -
视图*
Template
类位于Sharky\Libs
命名空间下,是一个模板引擎类,它通过提供了一系列功能用于加载模板、处理模板中的变量、指令等,并进行渲染输出。主要特性包括支持多语言翻译、模板编译缓存以及多种常见的模板指令处理,如变量输出、继承、块定义、条件判断和循环等,模版语法类似于Twig。 -
会话*
Session
类位于Sharky\Libs
命名空间下,是一个用于管理Session操作的工具类,它提供了一系列便捷的方法来处理会话相关的操作,如启动会话、设置会话变量、获取会话变量值、检查变量是否存在、删除特定变量以及销毁整个会话等。Cookie
类位于Sharky\Libs
命名空间下,是一个用于管理Cookie操作的工具类。它提供了一系列便捷的方法来设置、获取、检查和删除Cookie,使得在PHP应用程序中对Cookie的处理更加简单和规范化,遵循了良好的编程实践。 -
路由*
Route
类位于Sharky\Core
命名空间下,是框架中的路由管理模块,主要负责加载路由文件、注册路由及路由分组、格式化路径以及根据请求的方法和URI来派遣路由,从而确定要执行的相应控制器方法或回调函数。 -
伪静态*
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]
-
其他
SharkyException
类位于Sharky\Core
命名空间下,它继承自\Exception
类,主要用于统一处理应用程序中的异常和错误信息。通过设置全局的异常处理函数和错误处理函数,能够根据配置文件中的调试模式设置来决定如何展示错误信息,并且在出现异常或错误时渲染相应的错误页面。Array_Utils
类位于Sharky\Utils
命名空间下,是一个提供多维数组操作相关实用功能的工具类。它包含了用于深度合并数组、判断数组是否为关联数组、获取数组指定路径的值以及设置数组指定路径的值等方法,方便在处理多维数组时进行常见的操作。