dszczer / minion
强大的包装器,扩展Silex,融合了Silex的简洁性和Symfony 2的易用性
Requires
- php: >=5.6 || ~7.0
- knplabs/console-service-provider: ~1.0
- monolog/monolog: 1.*
- propel/propel: 2.*@dev
- propel/propel-service-provider: 2.*@dev
- silex/silex: 1.3.*
- symfony/console: 2.8.*
- symfony/twig-bridge: 3.*
- twig/twig: ~2.0-dev
Requires (Dev)
- phpunit/phpunit: 4.8.*
This package is not auto-updated.
Last update: 2022-02-01 12:54:56 UTC
README
强大的包装器,扩展Silex,融合了Silex的简洁性和Symfony 2的易用性。
目录
主要功能
- Silex 基本功能 (查看更多)
- Propel 2.x 集成
- Twig 2.x 集成
- 更灵活的服务
- 带有便捷帮助器的控制器类
- 命令行支持
安装
注意:Minion 需要 PHP 版本 5.6.x 或更高.
使用 Composer
在控制台中输入 composer require dszczer/minion
。
使用
项目目录树
图例
- * 必需
- [name] 目录
. (root directory)
+-- [app]*
| +-- config.yml*
| +-- parameters.yml*
| +-- routing.yml*
|
+-- [bin] (autogenerated by Composer)
|
+-- [src]* (project source code)
| +-- [Controller]*
| +-- [Resources] (required if using Twig)
| +-- [views]*
|
+-- [var]*
| +-- [cache] (must have write permission)
| +-- [log] (must have write permission)
|
+-- [vendor]* (Composer dependencies)
|
+-- [web]* (public access directory - server document root)
+-- assets (any directory structure)
+-- index.php (entry point)
自定义项目目录结构
如果您想使用其他目录结构或您别无选择(例如共享托管),您可以在第三 __construct
方法中定义自定义路径 Application
- 字符串
rootDir
- 项目根目录 - 字符串
packageDir
- Minion 供应商的根目录 - 字符串
configPath
- 配置文件路径,默认为/app/
- 字符串
propelConfigPath
- Propel 敏感数据和项目特定propel.php
配置文件路径;如果选项minion.usePropel
为false
则忽略
引导
您只需要包含 Composer 自动加载器,提供应用命名空间(不是必需的,但建议这样做),实例化 Minion\Application
并调用其上的 run()
方法即可引导 Minion。
// web/index.php require_once __DIR__ . '/../vendor/autoload.php'; // it is recommended to provide ./src/ namespace, but Minion will try to guess this value $namespace = 'Project\\'; $app = new Minion\Application($namespace, ['debug' => false, 'environment' => 'prod']); $app->run();
您需要配置您的服务器,将 ./web
目录作为唯一的公共访问目录,将 index.php
作为目录索引。更多信息请查看这里。
应用环境
可用的环境
prod
生产 - 应在生产服务器上使用的生产环境test
测试 - 测试环境,禁用错误异常处理
初始配置
您可以将多个选项传递到第二个 __construct()
参数的 Application 方法中
- 布尔值
debug
- 调试模式,true 表示启用,false 表示禁用 - 字符串
environment
['prod'|'test']
- 运行应用程序的环境 - 布尔值
minion.usePropel
- true 表示使用 Propel ORM,false 表示不使用 - 布尔值
minion.useTwig
- true 表示使用 Twig 模板,false 表示不使用
路由
路由映射
路由映射文件基于 Symfony 2 路由文件 组件。
# app/routing.yml homepage: path: / defaults: { _controller: "DefaultController::indexAction" } # ...
控制器
Minion 提供了有用的控制器基本类。要扩展此类并使用操作,请按照以下方式编写您的控制器
// src/Controller/DefaultController.php namespace Project\Controller; use Minion\Controller; use Minion\Application; use Symfony\HttpFoundation\Request; // ... class DefaultController extends Controller { public function indexAction(Request $request, Application $app) { // ... // if you're using Twig, path is relative to src/Resources/views/ return $this->render('index.html.twig'); // if you're not using Twig, path is relative to src/ return $this->render('template_index.html.php'); } }
重要:操作必须始终返回一个 Symfony\HttpFoundation\Response
对象(与 Symfony 2 完全相同)。有关可用方法的更多信息,请参阅 API 文档。
服务
Minion 中的服务介于 Silex 和 Symfony 2 之间。它们是可扩展的、灵活的且易于使用。
编写自己的服务
首先,您必须编写一个新的 Service 类
// src/Service/MyService.php namespace Project\Service; class MyService { public function foo() { return 'bar'; } }
然后,您应该编写提供者类
// src/Service/CustomServiceProvider.php namespace Project\Service; use \Minion\Service\ServiceProvider; use \Silex\Application as SilexApp; class CustomServiceProvider extends ServiceProvider { public function register(SilexApp $app) { $config = $this->getServiceConfig(); $app[ $config->getId() ] = $app->share(function(SilexApp $app) { return new MyService(); }); } public function boot(SilexApp $app) {} }
CustomServiceProvider
必须 扩展 Minion\Service\ServiceProvider
基本类或实现 Minion\Service\ServiceProviderInterface
接口。当然,您不仅可以共享一个新服务,还可以完全扩展现有的一个。以下示例是使用 Twig_Extension
类扩展 Twig
// src/Service/CustomServiceProvider.php namespace Project\Service; use \Minion\Service\ServiceProvider; use \Silex\Application as SilexApp; class CustomServiceProvider extends ServiceProvider { public function register(SilexApp $app) { $app['twig'] = $app->share($app->extend('twig', function (\Twig_Environment $twig, SilexApp $app) { $class = $this->getServiceConfig()->getOption('twig.extension.class'); // is \Project\Util\MyTwigExtension $twig->addExtension(new $class); return $twig; })); } public function boot(SilexApp $app) {} }
最后,您可以在 app/config.yml
文件中定义您的自定义服务
# app/config.yml services: my_custom_service_id: # unique service id class: "Project\\Service\\CustomServiceProvider" # service provider's fully qualified class name options: # options accesible inside service provider twig.extension.class: "\\Project\\Util\\MyTwigExtension"
好了!您已注册了新服务。您可以在控制器操作中使用它,例如
// ... class DefaultController extends Controller { public function defaultAction(Request $request, Application $app) { $myServiceName = $app['my_custom_service']->foo(); // should return 'bar' } }
提示:Minion 有它自己的 Twig 扩展服务提供程序扩展器,因此您不必编写自己的一个。 下面了解更多。
服务配置
在服务提供者的 register
方法中,您可以通过 Minion\Service\ServiceConfigInterface
完全访问服务配置。
// ... class CustomServiceProvider extends ServiceProvider { public function register(SilexApp $app) { $serviceConfiguration = $this->getServiceConfig(); } // ... }
服务标签
服务标签是 Minion 使用内置服务提供程序的标记,是特殊情况的使用。可用的标签
twig.extension
标签 twig.extension
在 app/config.yml
中定义如下
# app/config.yml services: my_custom_twig_extension_id: class: "\\Project\\Twig\\MyCustomTwigExtension" #options: # optional tags: - twig.extension
内置 Twig 扩展,可直接使用
内置 twig 扩展列表
AssetExtension
- 网页使用的资源,帮助定义网页或服务器端相关路径MiscExtension
- 一些可能有用的杂项函数UrlExtension
- 使用此扩展在模板中生成链接非常容易。有关可用方法的更多信息,请参阅 API 文档。
错误页面
Minion 允许您自定义 403
、404
和 500
HTTP 状态代码的错误页面。在您的模板作用域中(仅限)抛出的异常将可用于(Twig)exception
或(PHP)$exception
变量名称。模板文件可以是独立的,也可以扩展其他模板文件。
Twig 模板
将Twig模板放置在src/Resources/views/Static/<code>.html.twig
,其中<code>
是由应用程序生成的状态码。
PHP模板
如果您不使用Twig,请将PHP模板放置在src/Static/<code>.html.php
,其中<code>
是由应用程序生成的状态码。
控制台
Minion提供易于使用的CLI模式。所有项目特定命令应存储在src/Command
目录中,并应扩展Knp\Command\Command
类。有关Knp Command的更多信息请参阅此处。
命名约定
命令文件必须以Command.php
后缀命名。类名也必须包含Command
后缀。不满足这些条件的文件将被忽略。示例命令:
// src/Command/ProjectCommand.php namespace Project\Command; use Knp\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class ProjectCommand extends Command { // Configure command protected function configure() { $this ->setName('project') ->setDescription('project command') ; } // Execute command public function execute(InputInterface $input, OutputInterface $output) { $output->write('project command in practice'); } }
引导
Minion已经为CLI模式提供了引导文件,因此安装Composer依赖后,它应该可以在您的bin
目录中访问。
使用方法
要在CLI模式下运行Minion,请转到您的项目目录(bash、windows命令等),然后输入bin/console command:name
。
Minion为Propel命令提供自动加载器。如果您想使用propel命令,请在项目根目录中输入
bin/console propel:namespace:command
,例如bin/console propel:model:build
,或者只需使用别名bin/console build
。
注册
Minion具有命令自动加载器,因此您只需将Command
类放置在正确的目录src/Command
中即可。就是这样!当然,您可以在任何地方加载命令,只需在$app->run()
之前调用$app->loadCommands($path, $prefix)
。必需的$path
参数是包含命令文件的目录的绝对路径。可选的$prefix
参数是它们的命名空间。因此,如果您输入前缀,您的命令(例如)command:exec
将可在prefix:command:exec
下使用。
API文档
点击此处查看详细的API文档。