dev-master 2022-06-27 14:22 UTC

This package is auto-updated.

Last update: 2024-09-27 18:50:00 UTC


README

  _  __                          _______        __
 | |/ /__ _ _ __ _ __ ___   __ _|  ___\ \      / /
 | ' // _` | '__| '_ ` _ \ / _` | |_   \ \ /\ / / 
 | . \ (_| | |  | | | | | | (_| |  _|   \ V  V /  
 |_|\_\__,_|_|  |_| |_| |_|\__,_|_|      \_/\_/   

介绍

KarmaFW 是一个 PHP 小型框架,用于处理路由、模板和 SQL 数据库连接。

功能

  • Web 路由
  • PHP/HTML 模板
  • SQL 连接
  • Web 文件上传
  • 发送电子邮件 (SMTP)
  • 支付:Paypal, Payplug, Stripe
  • 身份验证:GoogleAuthenticator, SmsAuthenticator
  • PDF:创建 PDF (HTML to PDF)
  • 短信:发送短信 (Free & SmsEnvoi.com)
  • PHP 插件
  • Bitly:生成 bit.ly URL

先决条件

需要 Composer 来管理 PHP 类的自动加载。

控制台应用结构 在此

bin
    app_console.php
config
    config.php
src
    scripts
        my_test_script.php
    Models
    helpers
vendor
    karmasolutions/karmafw

Web 应用结构 在此

config
    config.php
    routes.php
public
    .htaccess
    index.php
    images
    css
    js
    vendor
src
  Controllers
    MyAppController
    HomeController
  Models
    User
  helpers
    helpers_myapp.php
templates
    homepage.tpl.php
vendor
    karmasolutions/karmafw

配置

应用程序的配置参数在 ./config/config.php 文件中声明。

应用程序的名称应在 APP_NAME 变量中定义。

define('APP_NAME', "Mon app PHP");

路由

路由在 ./config/routes.php 文件中声明。

每个路由都分配给一个控制器的方法,需要指定。

模板

模板文件的访问路径在配置变量 TPL_DIR 中设置。

define('TPL_DIR', APP_DIR . '/templates');

SQL 数据库

MySQL 连接信息在配置变量 DB_DSN 中设置。

define('DB_DSN', 'mysql://user:password@localhost/db_name');

使用

创建新项目

$ mkdir /var/www/my_app
$ cd /var/www/my_app
  1. Composer
$ composer init

在 composer.json 中添加以下内容:

{
    "repositories": [
        {
            "type": "path",
            "url": "/put/here/the/path/to/karmafw"
        }
    ],
    "require": {
        "karmasolutions/karmafw": "dev-master",
        "filp/whoops": "^2.2@dev"
    }
}
  1. 文档索引
mkdir -p public
nano public/index.php
<?php

// CONFIG
define('APP_DIR', realpath(__DIR__ . '/..'));
define('VENDOR_DIR', realpath(__DIR__ . '/../vendor'));


// AUTOLOAD
$loader = require VENDOR_DIR . '/autoload.php';
$loader->setPsr4('MyApp\\', __DIR__ . '/../src');



// APP BOOT
\KarmaFW\WebApp::boot();


// YOUR INIT CODE HERE
\KarmaFW\WebApp::getDb()->execute("set names utf8");


// APP ROUTE
\KarmaFW\WebApp::route();

  1. 应用配置

创建 config/config.php 文件并填写以下内容:

mkdir -p config
nano config/config.php
<?php

ini_set('display_errors', 1);

define('APP_NAME', "MyAPP");

define('ENV', "dev");

define('TPL_DIR', APP_DIR . '/templates');

define('DB_DSN', 'mysql://root@localhost/myapp');

创建 config/routes.php 文件并填写以下内容:

nano config/routes.php
<?php

namespace MyApp\config;

use \KarmaFW\Routing\Router;


// Homepage
Router::get('/', ['MyApp\\Controllers\\HomeController', 'homepage'])->setName('home');

5) 首页控制器:src/Controllers/MyAppController.php

mkdir -p src/Controllers
nano src/Controllers/MyAppController.php
<?php

namespace MyApp\Controllers;

use \KarmaFW\App;
use \KarmaFW\Routing\Controllers\WebAppController;
use \MyApp\Models\User;


class MyAppController extends WebAppController
{
	protected $db;
	protected $user;

	public function __construct($request_uri=null, $request_method=null, $route=null)
	{
		parent::__construct($request_uri, $request_method, $route);

		$this->db = App::getDb();

		if (! empty($this->user_id)) {
			$this->user = User::load($this->user_id);
			$this->template->assign('user', $this->user);
		}
	}
}

5) 首页控制器:src/Controllers/HomeController.php

nano src/Controllers/HomeController.php
<?php

namespace MyApp\Controllers;

use \KarmaFW\App;


class HomeController extends MyAppController
{

	public function homepage()
	{
		$this->template->assign('title', 'My APP');

		$db = App::getDb();

		$databases = $db->executeSelect('show databases');
		$this->template->assign('databases', $databases);

		$this->template->display('homepage.tpl.php');
	}
	
}

5) 首页模板:templates/homepage.tpl.php

mkdir -p templates
nano templates/homepage.tpl.php
<html>
<head>
	<title>{$title}</title>
</head>
<body>
<h1>hello world</h1>
<pre>
<?php print_r($databases); ?>
</pre>
</body>
</html>

5a) 布局:templates/layout.tpl.php

nano templates/layout.tpl.php
<html>
<head>
	<title>{$title}</title>
</head>
<body>
<h1>hello world</h1>

{$child_content}

</body>
</html>

5b) 带布局的首页模板:templates/homepage2.tpl.php

nano templates/homepage2.tpl.php
{layout layout.tpl.php}

<pre>
<?php print_r($databases); ?>
</pre>

良好实践

配置

配置文件(config.php & routes.php)、404 错误和异常页面(500)

SEO

URL 重写、标题、meta 描述、h1、规范链接、robots.txt、sitemap.xml

性能

opcache、memcache/redis 缓存、模板最小化/合并 CSS & JS、gzip、ETag + not_modified_304 + expire CDN

统计

流量日志、Google Analytics、Google 网站管理员工具