j7mbo/aurex

aurex是Silex微框架和强大的Auryn依赖注入器之间的合并。

1.0.2 2015-08-02 15:53 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:58:09 UTC


README

Silex加强版

Status Build Status

Aurex是将Silex微框架和Auryn依赖注入器合并而成。

Aurex在考虑最佳实践的情况下,对快速应用开发非常有用。如果你对代码了如指掌,你会非常喜欢它。

以下功能已集成

  • Doctrine ORM与实体/存储库/命令行/固定值
  • 与Doctrine实体一起工作的Symfony表单
  • Monolog日志记录,YAML配置解析和缓存
  • 工作自定义用户提供者,用户实体和登录表单
  • 集成Twig模板引擎
  • 工作防火墙 - 目前,匿名用户可以访问//login。其他一切都被保护了!
  • 控制器作为服务(每个控制器都是一个具有操作方法的对象)
  • 特定环境的配置文件
  • "模块"用于组织单独的服务提供者集成和设置
  • 从控制器开始的所有对象的递归自动绑定依赖注入

如果你知道如何使用Silex,那么你就知道如何使用Aurex,唯一的区别是不同的控制器解析器用于实例化控制器及其依赖项递归,服务提供者在单个对象(模块)中设置。

你可以将其用作一个独立的框架,用于编写好的SOLID代码,而不需要使用服务定位器来获取依赖项,或者将其分叉以查看如何使用最新的symfony组件来使Silex工作。实际上,这种设置允许你在任何地方对任何对象进行类型提示,它将自动为你解决,让你专注于你要创建的东西,而不是它们是如何相互传递的。

Aurex使用最新的Symfony 2.7组件,使用Silex 2,并会维护以保持与Silex发布的同步。

示例

我们将通过创建一个显示通过API调用检索到的数据的页面来介绍这个过程。这涉及到

  • 创建一个路由
  • 创建相应的控制器和模板
  • 在我们的控制器中使用第三方库来执行API请求
  • 在我们的模板中显示从API调用检索到的数据

这是一个非常基础的示例,但目的是展示通过依赖注入在不要求任何额外配置/对象注册的情况下,如何轻松地在应用程序中获取所需的对象。

Application/Config/routes.yml中添加一个路由

hello:
  pattern:    /hello
  controller: HelloController:indexAction
  template:   hello.html.twig

创建控制器作为:Application/Controller/HelloController,带有indexAction方法。如果你想访问常用对象,如安全、请求、会话或实体管理器,请扩展AbstractController

namespace Aurex\Application\Controller;

class HelloController extends AbstractController
{
    public function indexAction()
    {
        /** -- SNIP **/
    }
}

决定你想使用Guzzle Http库,例如,然后使用composer要求它

require guzzlehttp/guzzle:~5.0

在你的控制器中对GuzzleHttp\Client进行类型提示,以便无需额外配置即可自动传递给你(感谢Auryn注入器)。然后返回数据到模板

public function indexAction(GuzzleHttp\Client $client)
{
    /** @var $json A json string from the httpbin.org containing the origin ip address **/
    $json   = $client->get('http://httpbin.org/ip');
    $data   = json_decode($json, true);
    $origin = $data['origin'];
    
    return [
        'origin' => $origin
    ];
}

创建你的模板作为web/templates/hello.html.twig

    <p>
        Hello, you have access to the $origin variable in this Twig template.
        <br />
        It's value is: {{ origin }}.
    <p>

访问http://aurex.local/hello以查看你的页面。

这基本上与Silex/Symfony相同,但更加精简和快速。 那么这有什么意义呢?任何你需要访问的对象,比如Guzzle的HttpClient,你不需要设置。你只需在任何控制器中为它进行类型提示,它就会自动传递给你。这也是一种递归的方法——所以如果一个对象需要另一个对象,只需对第一个对象进行类型提示,依赖关系就会被创建,以便第一个对象可以进行注入。这是一个非常强大的工具,可以帮助你快速开发应用程序,无需担心如何获取所需的对象。

这是一个非常基础的例子。有关其他示例,包括别名等,请参阅EXAMPLE.md(目前处于WIP状态)。

安装

  • 您需要安装composer

  • 运行composer create-project j7mbo/aurex ./ 0.2.1

  • 创建虚拟主机(如果使用Apache,否则请参阅silex的Web服务器文档

      <VirtualHost aurex.local:80>
          ServerName aurex.local
          ServerAlias aurex.local
      
          DocumentRoot "/path/to/aurex/web/"
          DirectoryIndex index.php
      
          <Directory "/path/to/aurex/web/">
              Options Indexes MultiViews FollowSymlinks
              Order allow,deny
              Require all granted
              AllowOverride All
              Allow from All
          </Directory>
      </VirtualHost>
    
  • 设置日志文件权限,以便您的用户(用于doctrine cli)和您的web服务器(用于应用程序)。如果其他方法都失败了,请使用chmod 777并对自己的生活感到遗憾

  • 使用lib/Application/Config/dev.yml中的设置创建数据库(可以自由修改)

  • 使用vendor/bin/doctrine orm:schema-tool:create创建数据库模式

  • 使用以下命令运行 fixtures 以将用户角色和用户加载到数据库中:vendor/bin/doctrine fixtures:load ./lib/Application/Model/Fixture --append

  • 使用admin@aurex.compassword登录——您可以从lib/Application/Model/Fixture/LoadUsers.php中看到如何加载fixture数据

  • 在lib/Application中开始编写代码,因为这个目录不受版本控制

Auryn 依赖注入器

Auryn是一个递归依赖注入器。它使用反射,并缓存这些反射,以读取对象的构造函数和方法签名,并为您以反向顺序构建它们。需要多个对象作为依赖关系的对象可以使用$injector->make('Object');创建,而不是调用new Object(new Object2(new Object3))等。

注入器在控制器构造函数和方法上调用make()execute(),以便开发者可以在控制器中对任何所需的对象进行类型提示,当执行控制器代码时,它会自动实例化并传递给他们。这消除了服务定位器反模式,并允许您编写SOLID、面向对象的代码,无需担心如何连接或实例化对象或控制器中的对象。

auryn注入器提供了以下方法:

Auryn设置位于lib/Application/Config/dev.yml中的auryn_module键下。

我强烈推荐您查看Auryn存储库,并尝试使用它来了解其工作方式。

结果是可以为控制器中的任何对象、抽象或接口进行类型提示,并将它们自动传递给你!

模块

应该由单个对象或“模块”处理(封装)与相关配置的各个服务提供者对象之间的集成,以保持各自的独立。以前,一个大的过程文件被用来设置所有服务提供者。现在服务提供者使用可以更遵循SRP

ModuleLoader加载实现ModuleInterface的任何对象。每个模块都会接收到包含配置和auryn注入器对象的Aurex应用程序对象,你可以使用它来设置你自己的服务提供者。

模块的加载顺序与lib/Application/Config/global.yml中显示的顺序相同。要加载你刚刚创建的自定义模块,请添加完全限定的类名(包括命名空间),加载器将以指定的顺序加载模块。

使用模块来集成其他服务提供者或将在Silex\Application对象上操作的其他对象。每个模块还可以与Auryn注入器交互,以共享、委派或执行其他任何所需的操作,以确保你的对象在整个应用程序中正常工作。

例如,请参阅RoutingModule模块。此文件负责根据已解析的routes.yml文件设置路由。

启动

在你需要在对Aurex one执行后的自定义应用程序启动时,你可以修改lib/Application/index.php,因为这个文件在调用Silex\Application::run()之前被前者包含。

模板

Twig模板位于web/templates。如果你在routes.yml中指定了template键,你的控制器只需要返回一个数据数组,然后它就会被传递到模板。如果你省略了template键,你可以在控制器中对\Twig_Environment进行类型提示,并使用相关参数调用::render()来渲染模板。前者方法仅为了方便。

要在模板中访问user对象,Silex提供`{{ app['security.token_storage'].token.user }}`。

环境

通常应用程序需要不同的环境设置,如“dev”和“live”。Aurex提供了一个默认的DevEnvironment,如果可用,它会设置一些xdebug设置。环境是由一个EnvironmentFactory构建的。

你可以通过实现EnvironmentInterface并运行你在perform(Aurex $aurex)方法中需要的任何特定环境的逻辑来创建自己的自定义环境。文件global.yml包含加载你自己的环境文件的设置。

配置缓存

配置解析(尤其是YAML)的烦恼之处在于,在应用程序启动之前,每次请求都需要从文件中读取数据。因此存在I/O限制,如果可能的话,应该将这些数据缓存起来。如果您已安装memcached,则ParserCacherFactory会将解析后的配置数据存储在memcached中,以消除I/O开销。

因此,如果您向任何配置文件中添加/删除配置变量,并且已启用缓存实现(目前仅限于memcached),则需要重新启动memcached或手动删除配置键(目前是配置文件路径),以使新数据生效。