dszczer/minion

该包已被弃用且不再维护。未建议替代包。

强大的包装器,扩展Silex,融合了Silex的简洁性和Symfony 2的易用性

v1.0.0 2016-01-23 10:47 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:54:56 UTC


README

强大的包装器,扩展Silex,融合了Silex的简洁性和Symfony 2的易用性。

目录

  1. 主要功能
  2. 安装
  3. 使用
  4. API 文档

主要功能

  • 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.usePropelfalse 则忽略

引导

您只需要包含 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.extensionapp/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 允许您自定义 403404500 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文档。