mistermashu / funky
一个简单但强大的Web框架
Requires
- aws/aws-sdk-php: ^3.237
- phpmailer/phpmailer: ^6.4
This package is auto-updated.
Last update: 2024-09-06 23:16:00 UTC
README
Funky是一个PHP框架,它让创建任何PHP内容都变得简单。
这是规模,其中单词代表您可以使用Funky框架执行的所有操作:|raw---基本----简单----相当不错-----复杂----复杂----高级-----funky|
安装
- 首先,为您的项目创建一个新目录并进入该目录。例如,运行
mkdir my-cool-site && cd my-cool-site
- 然后,只需运行
composer require mistermashu/funky:dev-main && vendor/mistermashu/funky/install.sh
该命令的第一部分使用composer下载funky包。第二部分运行安装脚本,该脚本基本上生成了您所需的文件。
用法
以下列出Funky框架的基本概念。
服务
Funky的一般思想是将您的“全局函数”全部分离到服务中。服务允许您组织函数,并可以在每个站点的基础上轻松覆盖整个框架的任何逻辑。
一个简单的服务可能是这样的
namespace services; class greeter{ function greet(){ echo 'hello funky!!!'; } }
然后,要从任何地方(是的,任何地方。在原始PHP页面、模型、视图、控制器、服务函数中,实际上在任何地方)调用该函数,您只需键入
f()->greeter->greet();
这将导致Funky框架自动加载Greeter类,将其实例化为对象并保存该引用,因此第二次使用f()->greeter时,它实际上是同一个对象。这就是Funky框架所做的一切(这是一个好事,这意味着它非常轻量级),从这里开始,一切都关于只有在使用时才会加载的出色服务。此外,这允许您覆盖整个框架中的任何逻辑,因为一切都是服务。
您只需在您的站点中定义一个服务,Funky就会自动实例化新服务而不是框架中的服务。如果您想保留内置服务的大多数功能,但进行一些更改或添加,只需让您的服务类扩展内置的一个,如下所示
<?php // filename: src/services/request.php namespace services; class request extends \funky\services\request { // this function is now the main entry point for this request. public function perform() { // you could put some PHP here and it would happen at the beginning of every single request. // this is the normal entry-point for requests. // you can see this function in vendor/mistermashu/funky/src/services/request.php parent::perform(); // some PHP here would happen at the end of every single request. } }
模型、视图和控制器
由于MVC很棒,因此Funky中有一些很好的方式可以使用MVC来组织更大的项目。您不必使用这些,但您应该使用它们,因为它们很棒。
首先:控制器。
每个公共控制器函数代表您的站点的端点(或URI)。您可以有私有控制器函数,其中包含控制器逻辑,但不是端点。这样,根据您的函数命名自动处理路由,您可以通过拥有控制器轻松地自动获取多个路由。
MVC示例/教程
让我们创建一个简单的博客。这将巩固使用Funky服务以及如何使用MVC概念。
- 为您的博客控制器创建一个新文件 ([PROJECTROOT]/src/controllers/blog.php)
- 在
controllers
命名空间中创建一个名为blog
的基本类(注意:类名必须与文件名匹配) - 注意:它在
controllers
命名空间中,因为它在controllers
目录中。这样,Funky可以有效地找到所有控制器。
例如
<?php // filename: src/models/post.php namespace models; class post extends \funky\model { public static function from_slug($slug) { return static::query()->where(['slug'=>$slug])->first(); } // this function is required for every model. // this is what the migrator uses to automatically generation db migrations public static function fields() { return f()->load->fields([ ['title', 'text'], ['slug', 'slug'], ['content', 'markdown'], ['tags', 'set', ['values'=>[ 'personal', 'professional', 'gaming', ]]], ['date', 'date', ['default'=>'now']], ]); } }
<?php // filename: src/controllers/blog.php namespace controllers; class blog{ public function index(){ return f()->view->load('blog/index'); } public function show($slug){ return f()->view->load('blog/show', [ 'post'=>\models\post::find_by_slug($slug), ]); } }
- 为您的博客首页创建一个新文件 ([PROJECTROOT]/views/blog/index.php)
<h1>that one blog</h1> <p><?=$message?></p>
请注意,load视图函数是f()->view->load()
。这意味着它正在使用view
服务的load
函数。