我在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 /目录将是一个符号链接
答案 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,希望能对您有所帮助。