Symfony - 在 Bundle 中创建自己的配置 (service.yaml)
Symfony - Creating Own Config (service.yaml) Inside Bundle
我尝试了很多时间,但也许这是不可能的。
对不起,我的语言不好。
所以,我按照 Symfony Doc https://symfony.com/doc/current/bundles.html to create new Bundle, and than I followed https://symfony.com/doc/current/bundles/extension.html 创建了 DI 扩展。
我的文件:
AcmeHelloExtension.php
namespace App\Acme\HelloBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class AcmeHelloExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$loader = new XmlFileLoader(
$container,
new FileLocator(__DIR__.'/../Resources/config')
);
$loader->load('services.xml');
}
}
AcmeHelloBundle.php
namespace App\Acme\HelloBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeHelloBundle extends Bundle
{
}
我添加到config/bundles。php
src/Acme/HelloBundle/Resources/config/services.yaml
services:
App\Acme\HelloBundle\AcmeHelloBundle:
tags: ['example-tags']
此服务文件不是自动加载的,我需要执行后续步骤还是它应该可以工作?当我用 debug:container ....bundle... 检查它时
Option-Tags 具有空值。当我将此代码放入 config/services.yaml 时,它起作用了。
基本问题是包的源代码位于项目的 src 目录下:
project
src
Ztest
ZtestBundle.php
这反过来又导致捆绑包的服务被应用程序的 config/services.yaml 文件自动装配:
# project\config\services
App\:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
...
- '../src/Ztest' # Add this to fix the problem
排除包的源代码修复了问题。应用程序级别的自动装配会覆盖在捆绑包级别完成的任何手动装配。
当然,一般来说,如果您决定需要一个包,那么它的源代码应该在它自己的独立目录中:
project
src
src-ztest-bundle
为此,您还需要更新 composer.json 和 运行“作曲家 dump-autoload”的 psr-4 部分。
请记住,在 Symfony 4+ 中,自定义包的唯一推荐用法是用于跨多个 Symfony 应用程序共享的代码。在这种情况下,bundle 最终应该在它自己的存储库和 composer 包中结束。
但是,仍然支持应用程序内部的自定义包,有时它们会派上用场。
我尝试了很多时间,但也许这是不可能的。 对不起,我的语言不好。 所以,我按照 Symfony Doc https://symfony.com/doc/current/bundles.html to create new Bundle, and than I followed https://symfony.com/doc/current/bundles/extension.html 创建了 DI 扩展。
我的文件: AcmeHelloExtension.php
namespace App\Acme\HelloBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class AcmeHelloExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$loader = new XmlFileLoader(
$container,
new FileLocator(__DIR__.'/../Resources/config')
);
$loader->load('services.xml');
}
}
AcmeHelloBundle.php
namespace App\Acme\HelloBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeHelloBundle extends Bundle
{
}
我添加到config/bundles。php
src/Acme/HelloBundle/Resources/config/services.yaml
services:
App\Acme\HelloBundle\AcmeHelloBundle:
tags: ['example-tags']
此服务文件不是自动加载的,我需要执行后续步骤还是它应该可以工作?当我用 debug:container ....bundle... 检查它时 Option-Tags 具有空值。当我将此代码放入 config/services.yaml 时,它起作用了。
基本问题是包的源代码位于项目的 src 目录下:
project
src
Ztest
ZtestBundle.php
这反过来又导致捆绑包的服务被应用程序的 config/services.yaml 文件自动装配:
# project\config\services
App\:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
...
- '../src/Ztest' # Add this to fix the problem
排除包的源代码修复了问题。应用程序级别的自动装配会覆盖在捆绑包级别完成的任何手动装配。
当然,一般来说,如果您决定需要一个包,那么它的源代码应该在它自己的独立目录中:
project
src
src-ztest-bundle
为此,您还需要更新 composer.json 和 运行“作曲家 dump-autoload”的 psr-4 部分。
请记住,在 Symfony 4+ 中,自定义包的唯一推荐用法是用于跨多个 Symfony 应用程序共享的代码。在这种情况下,bundle 最终应该在它自己的存储库和 composer 包中结束。
但是,仍然支持应用程序内部的自定义包,有时它们会派上用场。