hostnet/hn-dependency-injection-plugin

此包已被废弃,不再维护。未建议替代包。

在Symfony 1应用程序中引入Symfony DI容器。

4.0.2 2021-10-26 15:46 UTC

README

  • 在Symfony 1应用程序中引入Symfony 2 DI容器。
  • 将Symfony 2 doctrine配置转换为Symfony 1.x可读格式。使用相同的数据库配置使用Doctrine实体和propel类!

Total Downloads Build Status

安装

  1. 下载Composer.
  2. 运行php composer.phar require hostnet/hn-dependency-injection-plugin
  3. 使apps/<app>/config/<app>Configuration扩展Hostnet\HnDependencyInjectionPlugin\ApplicationConfiguration
  4. [可选]覆盖getKernel方法以返回您自己的内核,注册您想要的捆绑包。
    protected function createKernel()
    {
        return new MyKernel($this);
    }
    
    class MyKernel extends Hostnet\HnDependencyInjectionPlugin\Symfony1Kernel
    {
        public function registerBundles()
        {
            $bundles = array(
                new Symfony\Bundle\FrameworkBundle\FrameworkBundle()
            );
            return array_merge($bundles, parent::registerBundles());
        }
    }
    
  5. 创建apps/<app>/config/config.yml来配置您的Doctrine dbalDoctrine orm以及可能还有FrameworkBundle。另请参阅示例配置
  6. 如果您不想生成propel向后兼容层,请将其添加到
    parameters:
        hn_entities_enable_backwards_compatible_connections: false
    
    config.yml,或如果您更喜欢将其分开,请添加到parameters.yml
  7. 为了确保在使用Doctrine实体时正确自动加载,如果您有
    require_once __DIR__ . '/../vendor/autoload.php';
    
    请将其删除,并将以下内容添加到您的config/ProjectConfiguration.php中。
    use Doctrine\Common\Annotations\AnnotationRegistry;
    
    $loader = require __DIR__.'/../vendor/autoload.php';
    AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
    
    这样Doctrine就知道在哪里找到您的实体。
  8. 请确保正确设置您的权限,请参阅"设置您的权限"。
  9. 完成后,我们可以进行一些清理。为了避免混淆,您应该删除config/databases.yml,因为此时只读取Symfony 2配置。

变更日志

2.0.0

  • 移除了Symfony1Panel类,现在它将自动添加。

1.1.0

  • 添加了一个带有到Symfony 2分析器的链接的Web调试面板。

为此,您需要激活WebProfilerBundle,您应该只在开发中激活它。

if ($this->getEnvironment() == 'dev') {
    $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
}

然后您需要配置WebProfilerBundle和分析器;将以下内容添加到您的config_dev.yml中

web_profiler:
    toolbar: true
framework:
    router:   { resource: "%kernel.root_dir%/../config/sf2_routing_dev.yml" }
    profiler:
        only_exceptions: false
        only_master_requests: true

将以下内容添加到sf2_routing_dev.yml中,以便使WebProfilerBundle可访问

_wdt:
    resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
    prefix:   /_wdt

_profiler:
    resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
    prefix:   /_profiler

_main:
    resource: sf2_routing.yml

并在web/*.php中,将$configuration->handle($request)->send();替换为

$response = $configuration->handle($request);
$response->send();
$configuration->terminate($request, $response);

现在您应该在Symfony 1 web调试工具栏中有一个新的面板,其中包含到Symfony 2分析器的链接!

1.0.0

  • 第一个正式版本

0.15

  • 添加了hn_entities_enable_backwards_compatible_connections参数

运行单元测试

  1. 自己克隆仓库
  2. 转到克隆的目录
  3. 运行composer.phar install
  4. 运行phpunit

将错误处理移动到Symfony 2

在迁移过程中,您最终会达到一个需要正确记录错误的位置。默认情况下,sfFrontWebController 包含一个 try-catch 块,用于捕获异常。为了将所有错误处理移动到 Symfony 2,您可以创建自己的前端控制器。如果您从该前端控制器中移除 try-catch 块,所有错误都将被 Symfony 2 的未捕获异常处理器捕获。

如果您的路由与 sf1 路由匹配,但 sf1 不认识该路由,它将抛出 sf404ErrorException 异常。该异常将被捕获,并封装成 HttpNotFoundException,最终触发 kernel.exception。这确保您可以在 Symfony 2 中处理所有异常。

此外,您可以在 sf1 中抛出异常,如 AccessDeniedExceptionNotFoundHttpException\RuntimeException 等。它们都将被捕获。在 404 错误的情况下,sf1 的回退将只触发一次,并且只能作为第一个控制器触发。一旦您通过 sf1 路由或正常入口成功进入 Symfony 2,它将不再被触发。

要添加前端控制器,您必须在 factories.yml 中设置它。

all:
  controller:
    class: MyCustomFrontController

要启用 Symfony2 的 404 处理,您必须将以下参数设置为 true。

hn_entities_enable_symfony2_404: true