eappointment/zmsslim

Slim框架的基本配置

2.27.0 2024-09-05 13:55 UTC

README

pipeline status coverage report

本模块旨在帮助创建基于Slim的框架应用。

安装

将这些行添加到您的composer.json中,并运行composer.phar update

    "require": {
       "eappointment/zmsslim": dev-main
    }

用法

该工具的想法是基于以这种方式实现Slim框架,即可以在不更改模块的情况下随时调整路由绑定。应通过composer将此仓库集成到您的项目中,并在项目的bootstrap.php中初始化。

配置了一个全局类\App,可以用来访问Slim实例。

访问Slim

可以通过\App::$slim访问Slim。如果可能,我们不推荐直接访问。

使用类BO\Slim\Render将输出渲染到视图中,其中提供了如withHtml()withJson()等函数。

渲染路由

<?php 
use BO\Slim\Render;

class MyController extends BaseController
{
    public function readResponse(
        \Psr\Http\Message\RequestInterface $request,
        \Psr\Http\Message\ResponseInterface $response,
        array $args
    ) {
        $data = fetchMyDataById($args['id']);
        if (amIWrongHere($data)) {
            return Render::redirect('myotherroute', $args);
        }

        $request = $this->initRequest($request);
        $noCacheResponse = \BO\Slim\Render::withLastModified($response, time(), '0');
        return $this->readResponse($request, $noCacheResponse, $args);
        return Render::withHtml(
            $response,
            'pathToTemplate.twig',
            array(
                'data' => $data
            )
        );
    }
}

如果配置(Application.php)中设置了多语言,则定义一个Basecontroller来初始化/准备请求,并设置响应的缓存时间。

<?php 
use BO\Slim\Render;

abstract class BaseController extends \BO\Slim\Controller
{
    public function __invoke(RequestInterface $request, ResponseInterface $response, array $args)
    {
        $request = $this->initRequest($request);
        $noCacheResponse = Render::withLastModified($response, time(), '0');
        return $this->readResponse($request, $noCacheResponse, $args);
    }

    public function readResponse(RequestInterface $request, ResponseInterface $response, array $args)
    {
        return parent::__invoke($request, $response, $args);
    }
}

多语言

要激活多语言,请将MULTILANGUAGE设置为true。您可以在config.php中这样做(推荐)或默认在Application.php中。

有一个基于Symfony的翻译类,可以使用不同的加载器来使用翻译文件。在我们的例子中,“json”和“pofile”可以用来。使用由变量$languagesource定义。

在变量$supportedLanguages中定义了要在应用程序中提供的个别语言,默认语言必须始终定义,即使不使用多语言。

<?php
    const MULTILANGUAGE = true;
    
    public static $languagesource = 'json';

    public static $language = null;

    public static $supportedLanguages = array(
        // Default language
        'de' => array(
            'name'    => 'Deutsch',
            'locale'  => 'de_DE',
            'default' => true,
        ),
        'en' => array(
            'name'    => 'English',
            'locale'  => 'en_GB',
            'default' => false,
        )
    );

翻译文件存储在根目录中的“lang”文件夹中。这些必须与格式“locale.filetype”相对应。“locale”是存储在“$supportedLanguage”数组中的“locale”值。例如

de_DE.json
en_GB.json

json示例

{
  "languageswitch": {
    "title": "language",
    "choose": "choose language",
    "languages": {
      "de": "Deutsch",
      "en": "English"
    }
  }
}

de_DE.po
en_GB.po

po示例

msgid "title"
msgstr "language"

msgid "choose"
msgstr "choose language"

msgid "de"
msgstr "Deutsch"

msgid "en"
msgstr "English"

日志记录

我们使用Monolog进行日志记录。该记录器实现了PSR3标准

<?php \App::$log->debug("My message", array($var1, $var2));

引导和配置

首先,您应该按照以下方式实现自己的class Application

src/MyApp/Application.php:

<?php

namespace `BO\MyApp

class Application extends \BO\Slim\Application
{
}

应用程序类包含您应用程序的默认设置。配置针对您的实例是特定的,不应将其检入VCS

config.php:

<?php

class App extends \BO\MyApplication
{
    const SLIM_DEBUG = true;
    const TEMPLATE_PATH = '/templates/';
    const DEBUG = false;
    const DEBUGLEVEL = 'WARNING';
}

您的系统初始化是在引导脚本中完成的

bootstrap.php:

<?php
// @codingStandardsIgnoreFile

// Define the application path as a single global constant
define("APP_PATH", realpath(__DIR__));

// use the autoloading provided by composer, see composer.json for path settings
require(APP_PATH . '/vendor/autoload.php');

// initialization of the static \App singleton
require(APP_PATH . '/config.php');

// set options for environment, routing, logging and templating
\BO\Slim\Bootstrap::init();

// Load routing
require(\App::APP_PATH . '/routing.php');

在特殊的顶级路由脚本中进行路由。我们建议使用单个文件以方便搜索可用路由。在路由中实现少量或没有逻辑,使用对现有类的引用

routing.php:

<?php

/* ---------------------------------------------------------------------------
 * html routes
 * -------------------------------------------------------------------------*/

\App::$slim->get('/',
    '\BO\MyAppController\Index')
    ->name("index");

/* ---------------------------------------------------------------------------
 * maintenance
 * -------------------------------------------------------------------------*/

\App::$slim->get('/healthcheck/', \BO\MyApp\Healthcheck::class)
    ->setName('healthcheck');

\App::$slim->getContainer()->offsetSet('notFoundHandler', function ($container) {
    return function (RequestInterface $request, ResponseInterface $response) {
        return \BO\Slim\Render::withHtml($response, 'page/404.twig');
    };
});

\App::$slim->getContainer()->offsetSet('errorHandler', function ($container) {
    return new \BO\MyApp\Handler\TwigExceptionHandler($container);
});
\App::$slim->getContainer()->offsetSet('phpErrorHandler', function ($container) {
    return new \BO\MyApp\Handler\TwigExceptionHandler($container);
});

最后,您需要一个index.php。它应位于名为public的子目录中。

public/index.php:

<?php
// Do not add any functionality here
include('../bootstrap.php');
\App::$slim->run();

如果您使用Apache2 Web服务器,则需要一个.htaccess文件以获得漂亮的URL

public/.htaccess:

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^_
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ /index.php [QSA,L]

Twig集成

我们的Slim实现使用Twig作为模板引擎。在引导文件中有两种配置选项

<?php
    \BO\Slim\Bootstrap::init();
    \BO\Slim\Bootstrap::addTwigExtension(new \BO\MyApp\TwigExtension());
    \BO\Slim\Bootstrap::addTwigTemplateDirectory('dldb', APP_PATH . '/vendor/bo/clientdldb/templates');

Twig 允许使用多个模板目录。要添加模板目录,可以使用 addTwigTemplateDirectory 函数。第一个参数是命名空间,第二个参数是目录的路径。要访问不同路径下的模板,可以使用如下语法

{% include "@namepace/templatename.twig" %}

为了扩展 Twig 的功能,可以定义自己的函数。使用 addTwigExtension() 函数添加扩展。第一个参数应该是 \Slim\Views\TwigExtension 类型。

我们在 Twig 模板中实现了几个预定义的函数

urlGet

<?php 
    public function urlGet($name, $params = array(), $getparams = array(), $appName = 'default')

创建一个用于链接定义路由的 URL。允许向 URL 中添加 GET 参数。

  • name String - 路由名称,见 routing.php。
  • params Array - 路由中定义的参数列表,如 "/user/:name/detail" 中的 "name"。
  • getparams Array - 要添加的参数列表,如 "/myuri?name=dummy" 中的 "name"。
  • appName String - 见 slim 文档,不支持。

csvProperty

<?php 
    public function csvProperty($list, $property)

允许从数组列表中提取属性作为 csv。例如,如果您有一个实体列表,并且需要将 ID 作为 URL 的参数。

  • List Array - 从中提取属性数组的列表。 Property String - 要提取的属性名称

azPrefixList

<?php 
    public function azPrefixList($list, $property)

要创建 A-Z 列表,需要按属性分组列表。

  • list array - 从中提取属性的数组。
  • property String - 按此属性分组列表的属性名称,第一个字符。

isValueInArray

<?php 
    public function isValueInArray($value, $params)

检查一个值是否是 CSV。与 csvProperty 结合使用很有帮助。

  • value String - 要检查的值。
  • params String - 以逗号分隔的值。

remoteInclude

<?php 
    public static function remoteInclude($uri)

在您的代码中包含远程 HTML 文件。如果配置设置 ESI_ENABLED 为 true,它将输出 <esi:include src="$uri" />

  • uri String - 要在模板中包含的 URL。