私人定制捆绑包在Symfony 4中的哪个位置?

时间:2018-01-25 00:48:41

标签: symfony symfony4

我在Symfony项目中使用了许多私有自定义捆绑包。在Symfony 3下,他们住在src的子目录中:

src/
    DSL/
      DSLLibraryBundle/
      DSLTelnetBundle/
      ...
    SiteBundle/      # (or AppBundle)

在Symfony 4下,特定于应用程序的软件包已经消失,我不清楚自定义软件包应该在哪里使用。

有关捆绑包的文档(https://symfony.com/doc/current/bundles/best_practices.html#bundles-naming-conventions)没有提供有关放置自定义捆绑包的具体建议。

我尝试将我的DSL目录直接放在项目目录下和src /下。无论如何,我最终都会遇到未定义的类错误。

我目前有:

src/
    DSL/
        LibraryBundle/
            DSLLibraryBundle.php

捆绑文件:

// src/DSL/DSLLibrary/DSLLibraryBundle.php:

namespace DSL\LibraryBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class DSLLibraryBundle extends Bundle
{

}

bundles.php中的条目:

DSL\LibraryBundle\DSLLibraryBundle::class => ['all' => true],

运行控制台命令时出现当前错误:

  

PHP致命错误:未捕获   Symfony \ Component \ Debug \ Exception \ ClassNotFoundException:试图   加载类" DSLLibraryBundle"来自命名空间" DSL \ LibraryBundle"。

一些注意事项:
- 我的自定义捆绑包未通过Composer安装 - 一旦我开始工作,实际的DSL /目录将是一个符号链接

4 个答案:

答案 0 :(得分:1)

2017年1月30日更新:

好。据我所知,Symfony 4实际上是私有捆绑的敌人。

其他工作不断出现越来越多的问题(例如让单元测试用于私有软件包)。

我目前正在寻求其他不会导致额外日常工作的选择。

请忽略我在下面的原始答案。

-

我原来的回答:

经过一番挖掘后,我意识到我的自定义捆绑目录树中的类在dump-autoload期间没有被作曲家选中。

认为这是因为Symfony 4不期待任何捆绑产品,除了供应商/。

解决方案是将我的库目录添加到composer.json。

所以我的项目树现在包含了我的私有自定义捆绑包的目录。

<projectName>/
    assets/
    ...
    DSL/
        DSLLibraryBundle/
        DSLTelnetBundle/
        ...
    public/
    src/
    ...

我的composer.json autoload.psr-4条目现在看起来像这样:

"autoload": {
    "psr-4": {
        "App\\": "src/",
        "DSL\\": "DSL/"
    }
},

答案 1 :(得分:1)

它实际上并没有其他评论中描述的那么糟糕 - 您仍然可以在 src/ 中拥有您的私有包,您只需要明确地将它们排除在自动装配之外,这样它们就不会意外加载不正确的命名空间。

假设您在 PrivateBundle 中有一个 src/PrivateBundle

您在 composer.json 中设置自动加载,如下所示:

"autoload": {
  "psr-4": {
    "App\\": "src/",
    "SomeNamespace\\PrivateBundle\\": "src/PrivateBundle/"
  }
}

并在您的服务配置中(我通常使用 config/services.yaml)执行以下操作:

# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
    resource: '../src/*'
    exclude: '../src/PrivateBundle'

如果您不添加此排除项,您的 SomeNamespace\PrivateBundle\* 类会被 Symfony 自动加载为 App\PrivateBundle\*,但包含 namespace SomeNamespace\PrivateBundle;,因此当 PHP 检测到 {{1} } 它会通过 Composer 再次自动加载它们,从而导致 SomeNamespace\PrivateBundle 错误。

答案 2 :(得分:0)

Symfony4不再使用src /中的bundle。捆绑包仅在供应商/作为依赖项中使用。

答案 3 :(得分:0)

2019年4月12日更新: 最后,我采取了与最初尝试完全不同的方法。
简而言之,我现在使用composer来包含我的自定义捆绑软件。

我的自定义包位于其自己的目录树中。
每个捆绑软件必须具有定义捆绑软件的有效composer.json文件。例如:

{
  "name": "dsl/base-bundle",
  "description": "Base bundle required by all other DSL bundles",
  "type": "symfony-bundle",
  "version": "2.1.0",
  "license": "proprietary",
  "authors": [{"name": "David M. Patterson", "email": "dpatterson@example.com"}],
  "minimum-stability": "stable",
  "require": {
  },
  "require-dev": {
  },
  "autoload": {
    "psr-4":  {
      "Dsl\\BaseBundle\\": "src/"
    }
  }
}

然后在项目的composer.json文件中定义一个自定义存储库:

"repositories":[
  {
    "type": "path",
    "url":  "/full/path/to/DslBaseBundle"
  },
 ], ...

然后做一个作曲家需要dsl / base-bundle
Composer将在供应商/包中创建一个符号链接,然后一切都将按预期运行。

我的个人图书馆是一个常规的Symfony项目,带有一个lib子目录,其中包含我的捆绑软件,每个捆绑软件都位于lib /下的自己的子目录中。

Symfony应用程序为我提供了一个方便的测试平台。请注意,自定义包必须与其他任何Symfony项目一样包含在其中。

@Stnaire,希望能对您有所帮助。