hostnet / hn-dependency-injection-plugin
在Symfony 1应用程序中引入Symfony DI容器。
Requires
- php: >=7.3
- doctrine/dbal: ^2.13.4||^3.1.1
- doctrine/doctrine-bundle: >=1.7.0
- doctrine/orm: >=2.6
- symfony/symfony: ^4.4||^5.0
- symfony/symfony1: ~1.1.27
Requires (Dev)
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^9.5.6
README
- 在Symfony 1应用程序中引入Symfony 2 DI容器。
- 将Symfony 2 doctrine配置转换为Symfony 1.x可读格式。使用相同的数据库配置使用Doctrine实体和propel类!
安装
- 下载Composer.
- 运行
php composer.phar require hostnet/hn-dependency-injection-plugin
- 使
apps/<app>/config/<app>Configuration
扩展Hostnet\HnDependencyInjectionPlugin\ApplicationConfiguration
。 - [可选]覆盖
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()); } }
- 创建
apps/<app>/config/config.yml
来配置您的Doctrine dbal、Doctrine orm以及可能还有FrameworkBundle。另请参阅示例配置。 - 如果您不想生成propel向后兼容层,请将其添加到
parameters: hn_entities_enable_backwards_compatible_connections: false
config.yml
,或如果您更喜欢将其分开,请添加到parameters.yml
。 - 为了确保在使用Doctrine实体时正确自动加载,如果您有
请将其删除,并将以下内容添加到您的require_once __DIR__ . '/../vendor/autoload.php';
config/ProjectConfiguration.php
中。
这样Doctrine就知道在哪里找到您的实体。use Doctrine\Common\Annotations\AnnotationRegistry; $loader = require __DIR__.'/../vendor/autoload.php'; AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
- 请确保正确设置您的权限,请参阅"设置您的权限"。
- 完成后,我们可以进行一些清理。为了避免混淆,您应该删除
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
参数
运行单元测试
- 自己克隆仓库
- 转到克隆的目录
- 运行
composer.phar install
- 运行
phpunit
将错误处理移动到Symfony 2
在迁移过程中,您最终会达到一个需要正确记录错误的位置。默认情况下,sfFrontWebController
包含一个 try-catch 块,用于捕获异常。为了将所有错误处理移动到 Symfony 2,您可以创建自己的前端控制器。如果您从该前端控制器中移除 try-catch 块,所有错误都将被 Symfony 2 的未捕获异常处理器捕获。
如果您的路由与 sf1 路由匹配,但 sf1 不认识该路由,它将抛出 sf404ErrorException
异常。该异常将被捕获,并封装成 HttpNotFoundException
,最终触发 kernel.exception
。这确保您可以在 Symfony 2 中处理所有异常。
此外,您可以在 sf1 中抛出异常,如 AccessDeniedException
、NotFoundHttpException
、\RuntimeException
等。它们都将被捕获。在 404 错误的情况下,sf1 的回退将只触发一次,并且只能作为第一个控制器触发。一旦您通过 sf1 路由或正常入口成功进入 Symfony 2,它将不再被触发。
要添加前端控制器,您必须在 factories.yml
中设置它。
all: controller: class: MyCustomFrontController
要启用 Symfony2 的 404 处理,您必须将以下参数设置为 true。
hn_entities_enable_symfony2_404: true