eappointment / zmsslim
Slim框架的基本配置
Requires
- php: >=8.0.0
- ext-json: *
- ext-posix: *
- eappointment/mellon: 2.06.*
- monolog/monolog: ^2.0
- slim/http-cache: 1.*
- slim/psr7: 1.*
- slim/slim: 4.*
- slim/twig-view: 3.*
- symfony/translation: ^5.2
- symfony/twig-bridge: ^5.2
- tracy/tracy: ^2.9
- twig/twig: 3.*
Requires (Dev)
- helmich/phpunit-psr7-assert: ^4.3.0
- phpmd/phpmd: @stable
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^9.5.4
- squizlabs/php_codesniffer: *
Provides
- dev-main
- 2.27.0
- 2.26.09-patch1
- 2.26.09
- 2.26.08
- 2.26.07
- 2.26.06
- 2.26.05
- 2.26.04
- 2.26.03
- 2.26.02
- 2.26.01
- 2.26.00
- 2.25.05
- 2.25.04
- 2.25.03
- 2.25.02
- 2.25.01
- 2.25.00
- 2.25.00-rc2
- 2.25.00-rc1
- 2.24.14
- 2.24.13
- 2.24.13-rc4
- 2.24.12
- 2.24.12-rc3
- 2.24.12-rc2
- 2.24.12-rc1
- 2.24.11
- 2.24.10
- 2.24.10-rc10
- 2.24.10-rc9
- 2.24.10-rc8
- 2.24.10-rc7
- 2.24.10-rc6
- 2.24.10-rc5
- 2.24.10-rc2
- 2.24.10-rc1
- 2.24.09
- 2.24.09-rc2
- 2.24.09-rc1
- 2.24.08
- 2.24.07
- 2.24.07-rc5
- 2.24.07-rc4
- 2.24.07-rc3
- 2.24.07-rc1
- 2.24.06-rc1
- 2.24.05-p3
- 2.24.05-p2
- 2.24.05-p1
- 2.24.05
- 2.4.10
- dev-berlin-2.27.01
- dev-berlin-2.27.0
- dev-berlin-60775-unit-test-imrpovement
- dev-berlin-2.26.09-patch1
- dev-berlin-2.26.09
- dev-berlin-Jun24-improvements
- dev-berlin-2.26.06
- dev-berlin-2.26.07
- dev-berlin-2.26.08
- dev-berlin-2.26.04
- dev-berlin-2.26.04-rc
- dev-berlin-2.26.02
- dev-berlin-2.26.01
- dev-berlin-2.26.00
- dev-berlin-2.25.05
- dev-berlin-2.25.04
- dev-berlin-2.25.03
- dev-berlin-2.25.02
- dev-berlin-2.25.01
- dev-berlin-rc-2.24.14
This package is auto-updated.
Last update: 2024-09-11 08:22:32 UTC
README
本模块旨在帮助创建基于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。