l0gin/slim-oop-skeleton

Slim 框架 3 的 OOP 骨架,包括 Web、安全 API 和 CLI 端点。

安装: 91

依赖项: 0

建议者: 0

安全性: 0

星级: 4

分支: 2

类型:项目

2.1.1 2017-05-05 11:52 UTC

This package is auto-updated.

Last update: 2024-08-29 04:37:35 UTC


README

License Latest Stable Version Total Downloads

这是一个为 Slim 3 完整的 OOP 骨架项目,包含以下有用的依赖项/中间件

这个骨架提供

--> 一个 Web 控制器 (app/src/Core/Controller/WebController.php),您可以扩展它以获取默认依赖项加载。它加载以下服务

  • Twig
  • Monolog
  • Flash

它还包括两个基于 Material Design Lite 的 Twig 模板。以下前后台模板

--> 一个使用基本身份验证、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

运行它

  1. $ cd my-app
  2. $ php -S 0.0.0.0:8888 -t public public/index.php
  3. 浏览到 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 引导类 - 加载和设置 App
  • app/Core/Bootstrap/CliBootstrap.php: 用于 CLI 端点的 CLI 引导类 - 加载和设置 App
  • app/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\DependenciesApp\Core\MiddlewaresApp\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-debugbarphp-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 安装公共供应商资产