l0gin / slim-oop-skeleton
Slim 框架 3 的 OOP 骨架,包括 Web、安全 API 和 CLI 端点。
Requires
- php: >=5.5.0
- league/climate: ^3.2
- mongodb/mongodb: ^1.0.0
- monolog/monolog: ^1.13
- php-middleware/php-debug-bar: ^1.1
- roave/security-advisories: dev-master
- slim/flash: ^0.1.0
- slim/slim: ^3.0
- slim/twig-view: ^2.0
- tuupola/slim-basic-auth: ^2.0
- tuupola/slim-jwt-auth: ^2.3
- zeuxisoo/slim-whoops: 0.5.*
This package is auto-updated.
Last update: 2024-08-29 04:37:35 UTC
README
这是一个为 Slim 3 完整的 OOP 骨架项目,包含以下有用的依赖项/中间件
- Twig
- Slim Flash Messages
- Monolog Seldaek/monolog
- PDO
- MongoDB mongo-php-library - Mongo Doc
- PHP Debug Bar maximebf/php-debugbar
- CLImate thephpleague/climate
- Whoops filp/whoops
这个骨架提供
--> 一个 Web 控制器 (app/src/Core/Controller/WebController.php
),您可以扩展它以获取默认依赖项加载。它加载以下服务
- Twig
- Monolog
- Flash
它还包括两个基于 Material Design Lite 的 Twig 模板。以下前后台模板
- 前台: https://material-design-lite.npmjs.net.cn/templates/android-dot-com/index.html
- 后台: https://material-design-lite.npmjs.net.cn/templates/dashboard/index.html
--> 一个使用基本身份验证、MongoDB 和 JSON Web Token (JWT) 中间件的受保护认证 API 控制器。
- GET -
api/auth
在认证成功后获取 JWT。 - GET -
api/user
获取用户信息。
--> 一个 CLI 控制器 (app/src/Core/Controller/CliController.php
),它加载 Monolog 和 CLImate 并提供一些有用的函数。
提供了一个 Setup
类,用于帮助初始化 MongoDB 结构并创建用户。
创建您的项目
该项目可在 Packagist 上找到,因此您可以使用以下命令创建一个新项目
$ composer create-project -n -s dev l0gin/slim-oop-skeleton my-app
运行它
$ cd my-app
$ php -S 0.0.0.0:8888 -t public public/index.php
- 浏览到 https://:8888
建议使用 Apache 2.4 和 PHP 7.0 (FPM)。
关键目录
app
: 应用程序代码app/src
:App
命名空间内的所有类文件app/templates
: Twig 模板文件app/conf
: 自定义/环境设置cache/twig
: Twig 自动创建的缓存文件log
: 日志文件public
: 服务器根目录public/assets
: 公共资源 (css, js, img, ...)vendor
: Composer 依赖项
关键文件
public/index.php
: 应用程序的入口点app/Core/Bootstrap/HttpBootstrap.php
: 用于 Web 和 API 端点的 HTTP 引导类 - 加载和设置 Appapp/Core/Bootstrap/CliBootstrap.php
: 用于 CLI 端点的 CLI 引导类 - 加载和设置 Appapp/Core/Settings.php
: 默认配置app/Core/Dependencies.php
: Slim DI 容器中的服务app/Core/Middlewares.php
: 应用程序中间件app/Core/Routes.php
: 所有应用程序路由都在这里app/src/Core/Controller/WebController.php
: Web 控制器超级类 - 用于 Web 端点app/src/Core/Controller/ApiController.php
: API 控制器超级类 - 用于 API 端点app/src/Core/Controller/CliController.php
:CLI 控制器超级类 - 用于 CLI 端点app/src/Controller/Web/Front.php
:主页控制器类app/src/Controller/Web/Back.php
:仪表板页面控制器类app/src/Controller/Api/Auth.php
:API 认证控制器类app/src/Controller/Api/User.php
:通过 API 执行用户操作的控制类app/src/Controller/Cli/Setup.php
:应用设置控制器类app/conf/local.settings.php.dist
:将此文件复制为 local.settings.php 并添加您自定义的/环境设置app/templates/layouts/front.twig
:前端布局页面主要 Twig 模板文件app/templates/layouts/back.twig
:后端布局页面主要 Twig 模板文件app/templates/pages/front/*
:前端页面 Twig 模板文件app/templates/pages/back/*
:后端页面 Twig 模板文件
使用依赖项
在您的控制器中覆盖父构造函数,并从 Slim 容器中加载依赖项。
加载 PDO 依赖项
<?php
final class MyController extends WebController
{
/**
* @var \PDO PDO Instance
*/
private $pdo;
/**
* MyController constructor override
*
* @param Container $c Slim App Container
*/
public function __construct(Container $c)
{
$this->pdo = $c->get('pdo');
parent::__construct($c);
}
//...
}
覆盖/设置本地(环境)设置
将 local.settings.php.dist
复制到 local.settings.php
并添加您的环境设置。
<?php
return [
'settings' => [
//Slim Settings
'displayErrorDetails' => true, //Display Slim Errors
// PDO settings
'pdo' => [
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'mydb',
'user' => 'foo',
'passwd' => 'bar'
],
// Mongo DB settings
'mongo' => [
'host' => '127.0.0.1',
'port' => 27017,
'options' => [
//"username" => 'foo',
//"password" => 'bar'
],
'driverOptions' => [],
'default_db' => 'database'
],
//Google Analytics
'google_analytics' => [
'api_key' => 'UA-XXXXX-Y',
'anonymize_ip' => false
]
]
];
添加依赖项/中间件/路由
App\Core\Dependencies
、App\Core\Middlewares
和 App\Core\Routes
类具有自动加载功能,它会调用以 load
开头的方法(例如 loadTwig
)。
因此,要添加一个服务、中间件或新的路由函数(可以在每个 load
函数中添加多个路由),请添加以下服务设置函数:
<?php
/**
* Load Faker
*/
protected function loadFaker()
{
/**
* Faker Factory Service
*
* @param Container $c
*
* @return \Faker\Factory
*/
$this->dic['faker'] = function (Container $c) {
return Faker\Factory::create();
};
}
/**
* Load AMQP Stream Connection
*/
protected function loadAMQP()
{
/**
* AMQP Stream Connection
*
* @param Container $c
*
* @return \PhpAmqpLib\Connection\AMQPStreamConnection
*/
$this->dic['amqp'] = function (Container $c) {
$settings = $c->get('settings')['amqp']; //@TODO: Add this setting into Settings.php and/or local.settings.php
return new \PhpAmqpLib\Connection\AMQPStreamConnection(
$settings['amqp']['host'],
$settings['amqp']['port'],
$settings['amqp']['user'],
$settings['amqp']['pass']
);
};
}
要简单添加 front-office
路由,只需将其添加到 loadFrontRoutes()
函数中。(直接在 Routes
类内部或扩展类内部)。
<?php
// /!\ Directly inside Routes class
/**
* Load front-office routes
*/
protected function loadFrontRoutes()
{
$this->app->get('/', 'App\Controller\Front:homeAction')
->setName('homepage');
$this->app->get('/contact', 'App\Controller\Front:contactAction')
->setName('contact');
}
// /!\ Inside a Routes extended class
class MyRoutes extends \App\Core\Routes
{
//...
/**
* Load front-office routes
*/
protected function loadFrontRoutes()
{
parent::loadFrontRoutes();
$this->app->get('/contact', 'App\Controller\FrontController:contactAction')
->setName('contact');
}
//...
}
调试栏
在浏览器中显示带有 PHP 信息的调试栏!不再需要在您的代码中使用 var_dump()!
https://github.com/maximebf/php-debugbar
maximebf/php-debugbar
由 php-middleware/phpdebugbar
处理,来自 https://github.com/php-middleware/phpdebugbar
它加载以下收集器
默认收集器
- PhpInfoCollector
- MessagesCollector
- RequestDataCollector
- TimeDataCollector
- MemoryCollector
- ExceptionsCollector
额外收集器
- ConfigCollector(基于应用设置)
- MonologCollector
- PDOCollector
命令行界面(PHP CLI)端点
此骨架提供了一个 CLI 端点,以帮助您使用核心应用依赖注入和所有其他内容创建 CLI 脚本。
例如,要运行 init()
函数从 App\CLI\Setup
$ php bin/cli.php -s Setup::init -v
添加一些详述
$ php bin/cli.php -s Setup::init -v
# Or
$ php bin/cli.php -s Setup::init --verbose
打印帮助
$ php bin/cli.php -s Setup::init -h
# Or
$ php bin/cli.php -s Setup::init --help
通过从 App\Controller\Cli\Setup
调用 user()
函数添加或更新用户
$ php bin/cli.php -s Setup::user -l admin2 -p coucou -g test -v
添加参数和帮助
要添加参数检查,请覆盖 checkParameters()
函数,如 Setup.php
所做,并使用 addParameter()
函数来
- 添加短选项和长选项(与 getOpt() 相关)
- 描述参数
- 添加示例
描述和示例将由 printHelp()
函数自动打印。
<?php
/**
* Custom parameter check
*
* @return bool Return false will automaticaly call printHelp() function and stop script execution
*/
public function checkParameters()
{
// Add custom parameter
$this->addParameter('a', 'all', 'Setup All', '--all');
if(parent::checkParameters()) {
// Check custom parameter
$aOpt = $this->getArg('a');
if ($aOpt !== null) {
$this->initAll = true;
}
return true;
} else {
return false;
}
}
资产管理
要完全部署项目,您需要遵循一些其他设置步骤
#Install gulp globally:
$ npm install --global gulp
#Install gulp in your project devDependencies:
$ npm install --save-dev gulp`
安装 Gulp 依赖项
$ npm i
运行 Gulp 任务
# CSS task: clean CSS files
$ gulp beautify_css
# Deploy assets for production: minify CSS, JS
$ gulp
# Or
$ gulp prod
# Build as you dev (Auto launch 'gulp prod' on file changing)
$ gulp wath
故障排除
Gulp-autoprefixer 问题
如果您在运行 gulp build 时遇到类似错误
#!shell
/var/www/websites/weather-dashboard/web/node_modules/gulp-autoprefixer/node_modules/postcss/lib/lazy-result.js:157
this.processing = new Promise(function (resolve, reject) {
^
ReferenceError: Promise is not defined
at LazyResult.async (/var/www/websites/weather-dashboard/web/node_modules/gulp-autoprefixer/node_modules/postcss/lib/lazy-result.js:157:31)
请参阅此处: http://stackoverflow.com/a/32502195
Twig 扩展
此骨架提供了一个自定义的 Twig 扩展,实现了以下 Twig 函数
getCssUrl(asset): 如果 ['assets']['min'] == true 且文件存在,则返回最小化 CSS 文件 URL。否则,如果存在则返回原始 CSS 文件 URL
<link rel="stylesheet" href="{{ getCssUrl('front.main.css') }}">
getJsUrl(asset):如果 ['assets']['min'] == true 且文件存在,则返回最小化 js 文件 URL。否则,如果存在则返回原始 js 文件 URL。
<script type="text/javascript" src="{{ getJsUrl('front.main.js') }}"></script>
添加 Twig 函数
您可以通过编辑或覆盖 App\Core\Twig\AssetTwigExtension
来添加 Twig 函数。要添加一个 Twig 函数,只需添加一个以 Twig 函数名称开头并以 Function
结尾的函数。
<?php
/**
* Twig Function to get JS asset URL
*
* @param $filename
*
* @return string
* @throws \Exception
*/
public function getJsUrlFunction($filename)
{
return $this->getAssetUrl('js', $filename);
}
系统认证
基本认证 & JWT
通过在 /api/auth
进行认证以获取 JSON Web Token,然后只需处理该令牌。
$ curl -X GET -H "Authorization: Basic YWRtaW46Y291Y291" -H "Cache-Control: no-cache" "http://www.foo.bar/api/auth"
响应
{
"status": "ok",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0Njc4MDU2MDQsImV4cCI6MTQ2NzgxMjgwNCwianRpIjoiR2NRa3VoM3poeVBhRUJyVUVtaGsrdz09Iiwic3ViIjoiNTc3Y2Q1ZWNkNDJhYTQyYzVkMWZmMzQyIn0.4GectmgSi4qOforBGm31Z8Qd4b2kM_EFrNC9TfQXkos"
}
使用来自 api auth 的 JWT 获取用户信息
$ curl -X GET -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0Njc4MDU2MDQsImV4cCI6MTQ2NzgxMjgwNCwianRpIjoiR2NRa3VoM3poeVBhRUJyVUVtaGsrdz09Iiwic3ViIjoiNTc3Y2Q1ZWNkNDJhYTQyYzVkMWZmMzQyIn0.4GectmgSi4qOforBGm31Z8Qd4b2kM_EFrNC9TfQXkos" -H "Cache-Control: no-cache" "http://www.foo.bar/api/user"
响应
{
"login": "admin",
"created_at": "48482-09-12 15:03:51",
"updated_at": "48482-09-12 15:03:51",
"group_name": "test",
"group_id": "577cd5ebd42aa42c5d1ff341"
}
路线图
- 单元测试端点
- PHP 文档生成器
- REST API 文档生成器(Phinx、APIJS、...)
- Bower 安装公共供应商资产