enygma / slim-app-skeleton
Slim 应用程序的骨架(包含额外功能)
Requires
- aura/session: ^2.1
- defuse/php-encryption: ^2.0
- illuminate/database: ^5.3
- psecio/validation: 0.*
- robmorgan/phinx: ^0.6.5
- slim/slim: ^3.5
- slim/twig-view: ^2.1
- vlucas/phpdotenv: ^2.4
Suggests
- deployer/deployer: Allows for easier, repeatable application deployments
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
配置文件
手动
手动过程遵循相同的流程,您只需手动完成。以下是基本步骤:
- 将
.env.example
文件复制到.env
- 使用您喜欢的文本编辑器打开文件,并更新设置以匹配您的配置
- 将
phinx.yml.example
文件复制到phinx.yml
- 打开它,并在
development
部分更新它,包括您的数据库配置信息(与.env
中的一致) - 使用此命令生成加密密钥
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
值来简化数据保护。此处理器允许您通过两个函数调用(encrypt
和 decrypt
)轻松地对字符串值进行加密/解密。您可以通过控制器中的 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); } } ?>