mistermashu/funky

一个简单但强大的Web框架

dev-main 2023-01-06 19:27 UTC

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概念。

  1. 为您的博客控制器创建一个新文件 ([PROJECTROOT]/src/controllers/blog.php)
  2. controllers命名空间中创建一个名为blog的基本类(注意:类名必须与文件名匹配)
  3. 注意:它在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),
		]);
	}
}
  1. 为您的博客首页创建一个新文件 ([PROJECTROOT]/views/blog/index.php)
<h1>that one blog</h1>
<p><?=$message?></p>

请注意,load视图函数是f()->view->load()。这意味着它正在使用view服务的load函数。

贡献者

Matt Larson