enygma/slim-app-skeleton

Slim 应用程序的骨架(包含额外功能)

0.3 2016-12-27 18:50 UTC

This package is auto-updated.

Last update: 2024-09-15 10:56:02 UTC


README

此项目是一个包含以下内容的 Slim 应用程序基本骨架:

  • 控制器支持
  • 通过 Twig 视图(包括布局)进行模板化
  • MVC 应用程序的基本文件结构
  • 使用 Phinx 进行数据库迁移
  • 使用 Eloquent 处理数据库模型和表格
  • 使用 Defuse PHP Encryption 库进行简单的加密
  • 提高会话安全性(包括加密)

安装

您可以通过两种方式安装该项目并使其运行:自动化和手动

自动化

要使用自动化方法,请在项目的根目录中执行 setup.sh 脚本

chmod +x setup.sh
./setup.sh

这将向您提出一系列问题以设置应用程序并创建与配置匹配的 .env 配置文件

手动

手动过程遵循相同的流程,您只需手动完成。以下是基本步骤:

  1. .env.example 文件复制到 .env
  2. 使用您喜欢的文本编辑器打开文件,并更新设置以匹配您的配置
  3. phinx.yml.example 文件复制到 phinx.yml
  4. 打开它,并在 development 部分更新它,包括您的数据库配置信息(与 .env 中的一致)
  5. 使用此命令生成加密密钥
php -r 'require_once "vendor/autoload.php"; $key = Defuse\Crypto\Key::createNewRandomKey(); echo $key->saveToAsciiSafeString();'

并将 ENC_KEY 值替换为结果 6。创建一个 tmp/ 目录,并使用 chmod 权限

mkdir tmp;
chmod -R 777 tmp;

托管网站

内置 PHP 服务器

使用骨架的最简单方法是使用内置的 PHP 服务器在本地提供服务。为此,将存储库克隆到目录中,然后 cd public/。一旦进入公共目录,使用此命令托管网站

php -S localhost:8080

这将使网站在 http://localhost:8080 上可用 - 如果您在浏览器中访问此 URL,

使用 Apache 托管

您还可以设置虚拟主机,从 Apache 实例中提供服务。确保已启用 mod_rewrite,并将您的 Web 服务器指向 public/ 目录作为文档根

<VirtualHost *:80>
	ServerName slim-app.localhost
	DocumentRoot /var/www/slim-app/public
	ErrorLog "/var/log/www/slim-app-error_log"
</VirtualHost>

请确保替换您环境的主机名和 ErrorLog 路径。

使用项目

以下是如何实际使用该项目以及处理路由、控制器和视图的信息。

添加新路由

默认安装包含一个简单的 "index" 路由示例,您可以使用它作为参考,但以下是设置新控制器及其所有匹配部分的指南

创建控制器类

控制器类应该以 *Controller.php 命名约定创建在 App\Controller 中。因此,如果您想为 "Foo" 添加一些路由,文件应该是 App\Controller\FooController.php,并包含以下内容

<?php

namespace App\Controller;

class FooController extends \App\Controller\BaseController
{
    public function index()
    {
        return $this->render('/foo/index.php');
    }
}

现在我们已经有了控制器,让我们添加相应的视图和匹配的路由。

创建视图

在添加新的控制器/路由的情况下,您可能希望保持项目的整洁,并在基础目录下的 templates\ 目录中创建一个名为 foo 的目录。在上面的控制器中,我们调用了 index.php 视图,所以让我们将它放在 templates\foo\index.php

{% extends 'layouts/main.php' %}

{% block content %}

Foo index view!

{% endblock %}

默认情况下,应用程序使用 Twig 进行输出模板化。在这个例子中,我们扩展了主布局(在 templates\layouts\main.php)并为“foo”索引视图添加了内容。

创建路由

最后,我们将添加路由来连接这两者。编辑 bootstrap\routes.php 文件,并添加以下内容:

$app->get('/foo', '\App\Controller\FooController:index');

这就是全部内容 - 现在当您访问应用程序上的 /foo 端点时,应该会看到“Foo索引视图!”内容。

访问会话

默认情况下,应用程序还包含会话支持。您可以通过容器和 session 辅助属性轻松地在控制器中访问它。

<?php

namespace App\Controller;

class IndexController extends \App\Controller\BaseController
{
    public function index()
    {
        $myValue = 'foo';
        // Set the value
        $this->session->set('myvalue', $myValue);

        // Get the value
        $this->session->get('myvalue');

        return $this->render('/index/index.php');
    }
}

与模型一起工作

此骨架利用了Laravel框架的封装版本Eloquent功能。您可以在Laravel网站上查看更多文档信息。

要在骨架应用程序中创建新模型,您需要在 App\Model 中添加一个新文件,其名称与您的表相同。例如,如果您有一个名为 users 的表,您应该在 App\Model\User.php 中创建一个 User 模型。

<?php

namespace App\Model;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
	/* nothing to see, move along */
}

然后您可以通过自动加载在任何地方使用此模型。

$user = new \App\Model\User();

此系统中的所有Eloquent功能,包括关系,都可以正常工作。

处理验证

该包还包括psecio/validation库,可用于一次性验证或请求验证。它包括一个适用于Slim v3应用程序的请求验证器,可以轻松在控制器中使用以确保提交的信息有效。

<?php

namespace App\Controller;

class IndexController extends \App\Controller\BaseController
{
    public function index($request, $response, $args)
    {
        $data = [];
        $validator = \Psecio\Validation\Validator::getInstance('request.slim3');

        $result = $validator->execute($request, [
            'email' => 'required|email'
        ]);
        if ($result !== true) {
			echo 'fail!';
		}

        return $this->render('/index/index.php', $data);
    }
}
?>

$request 实例传递给验证器的 execute() 方法,一个布尔结果显示测试的状态。您可以在 psecio/validation 的GitHub仓库中找到更多关于如何使用此库的信息。

数据加密

该骨架还配备了简单的加密处理器,利用配置中的 ENC_KEY 值来简化数据保护。此处理器允许您通过两个函数调用(encryptdecrypt)轻松地对字符串值进行加密/解密。您可以通过控制器中的 encryption 辅助功能访问它。

<?php

namespace App\Controller;

class IndexController extends \App\Controller\BaseController
{
    public function index($request, $response, $args)
    {
		$string = 'this is my string';

		// Encrypt the string for use in the page
		// You can decrypt this data with the $this->encryption->decrypt($data) call
		$data = [
			'string' => $this->encryption->encrypt($string)
		];

		return $this->render('/index/index.php', $data);
	}
}
?>