试图升级现有的Symfony 3.3.2项目以使用自动配线。
遵循以下说明:https://symfony.com/doc/current/service_container/3.3-di-changes.html#content_wrapper.
对我来说不起作用的是能够将目录中的所有服务设置为public。
重要提示:My services.yml文件位于src/SiteBundle/Resources/config中,而不是app/config中。
# src/SiteBundle/Resources/config/services.yml
services:
_defaults:
autowire: true
autoconfigure: true
public: false
SiteBundle\Service:
resource: '../../Service'
public: true
CustomerOrderMasterRepository:
class: Doctrine\ORM\EntityRepository
factory: ["@doctrine.orm.entity_manager", get_repository]
arguments:
- SiteBundle\Entity\CustomerMaster
SiteBundle\Service\CustomersService:
arguments:
- '@doctrine.orm.entity_manager'
- '@CustomerMasterRepository'
然后,如果我执行控制台调试:容器|grep-i服务,它只显示输出标头和Symfony服务容器。src/SiteBundle/Service目录中的类都没有被拾取。
Symfony容器公共服务服务ID
类名服务\u容器
Symfony\Component\DependencyInjection\ContainerInterface
如果我添加--show-Private,那么它们就会显示出来(以及许多其他东西)。
Symfony容器公共和私有服务服务ID
类名
1\u BCF140BB848EF41617942628C8525B487274E826D00FEE6AAABBF2EDE89FBB8
Symfony\Component\DependencyInjection\ServiceLocator
Psr\Container\ContainerInterface
服务容器的别名
SiteBundle\Service\CustomerOrderService
SiteBundle\Service\CustomerOrderService
SiteBundle\Service\CustomerService
SiteBundle\Service\CustomerService
SiteBundle\Service\InventoryItemsService
SiteBundle\Service\InventoryItemsService
SiteBundle\Service\VendorOrdersService
SiteBundle\Service\VendorsService
SiteBundle\Service\VendorsService
SiteBundle\Service\WorkOrdersService
Symfony\Component\DependencyInjection\ContainerInterface
服务\容器的别名参数\u解析器.service
Symfony\Component\HttpKernel\Controller\ArgumentResolver\servicevaluereresolver routing.loader.service
Symfony\Component\routing\loader\DependencyInjection\ServiceRouterLoader security.authentication.rememberme.services.abstract
security.authentication.rememberme.services.persistent
Symfony\Component\Security\Http\RememberMe\persistentTokenBasedMemberMeservices安全性。身份验证。RememberMe.services.simplehash
Symfony\Component\Security\Http\RememberMe\tokenBasedMemberMeservices服务\u容器
Symfony\Component\DependencyInjection\ContainerInterface
服务定位器。1712c3a50d1ec2c742bad0f03bb76c
Symfony\Component\DependencyInjection\ServiceLocator
服务定位器26AC001B3EDA2481AC0DE703666B4D7
Symfony\Component\DependencyInjection\ServiceLocator
服务定位器39E66302324CA5BA91E98FDD8A17B
Symfony\Component\DependencyInjection\ServiceLocator
服务定位器6F24348B77840EC12A20C2A3F985CF7
Symfony\Component\DependencyInjection\ServiceLocator
服务定位器。8925f20c49cbd61fcb37adf8c595459e
Symfony\Component\DependencyInjection\ServiceLocator
服务定位器。b8d2046fb854cde05549fb309e1a80d2
用于“1”的别名
服务定位器。CEB8BB9F48E8BFD1C8EC2D209EABDCA
Symfony\Component\DependencyInjection\ServiceLocator
如果注释掉SiteBundle\Service\CustomerService定义,debug:container命令将引发以下异常:
PHP致命错误:未捕获Symfony\Component\DependencyInject\Exc0019\AutowiringFailedExcture:无法自动连接服务"SiteBundle\Entity\Customer MasterRepository":参数"$em"的方法"Doctrine\ORM\EntityRepository::__construct()"必须有类型提示或显式地赋予一个值。坦白地说,我无法理解。
建议?谢谢
要使自定义存储库工作,我必须重写__construct
方法,以提供EntityManager
和ClassMetadata
,如下所示:
app/config/services.yml
services:
_defaults:
autowire: true
autoconfigure: true
public: false
app.repository.channel:
class: \AppBundle\EntityRepository\ChannelRepository
src/AppBundle/EntityRepository/ChannelRepository.php:
<?php
namespace AppBundle\EntityRepository;
use AppBundle\Entity\Channel;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\ClassMetadata;
class ChannelRepository extends RepositoryFactory
{
public function __construct(EntityManager $entityManager)
{
parent::__construct($entityManager, new ClassMetadata(Channel::class));
}
public function getOneByName(string $name)
{
return $this->findOneBy(['name' => $name]);
}
}
src/AppBundle/Entity/Channel.php
<?php
namespace AppBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="channel")
* @ORM\Entity(repositoryClass="\AppBundle\EntityRepository\ChannelRepository")
*
*/
class Channel
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @return int
*/
public function getId()
{
return $this->id;
}
}
这是主要问题:
PHP致命错误:未捕获Symfony\Component\DependencyInject\Exc0019\AutowiringFailedExcture:无法自动连接服务"SiteBundle\Entity\Customer MasterRepository":参数"$em"的方法"Doctrine\ORM\EntityRepository::__construct()"必须有类型提示或显式地赋予一个值。坦白地说,我无法理解。
当您使用EntityRepository作为s服务,但从Doctrine BaseRepository继承时,就会发生这种情况。这种结合永远不会发生。
存储库应使用合成,以获得如下原则:
<?php
namespace AppBundle\EntityRepository;
use AppBundle\Entity\Channel;
use Doctrine\ORM\EntityManager;
class ChannelRepository
{
private $repository;
public function __construct(EntityManager $entityManager)
{
$this->repository = entityManager->getRepository(Channel::class);
}
public function getOneByName(string $name)
{
return $this->repository->findOneBy(['name' => $name]);
}
}
如果您想了解更多,这里有一篇文章提供了很好的代码示例:如何在Symfony中使用带有条令的存储库作为服务
我在Symfony 3.4中开发一个迷你应用程序。正在使用Guard进行身份验证过程。我已经创建了一个名为LoginForm签字机的类,它扩展了AbstractFormLogin签字机。 接收错误: 无法自动连接服务“app.security.login\u form\u authenticator”:方法“AppBundle\security\LoginFormAuthenticator:::\
问题内容: 想知道不指定classpath选项时默认的classpath是什么吗? 问题答案: 当前的工作目录()。 从Java™教程中:PATH和CLASSPATH: 类路径 的 默认值为“。” ,表示仅搜索当前目录。指定CLASSPATH变量或-cp命令行开关将覆盖此值。 这包括子目录吗? 不,在类路径中没有条目是“递归的”。您必须明确列出每个子目录(或jar)。但是,如果您有一个表示clas
我一直在Linux中使用squeelize和sqlite3开发一个电子应用程序,并且一切都运行得很好。我这样连接数据库: 其中myPath的形式为“/home/.../somedb.db” 但是,我尝试在Windows上运行我的项目,但在连接到DB时遇到了问题。 如果对myPath使用'somedb.db',我可以连接到数据库,但是当myPath是形式为'c:...\somedb.db'的绝对时,
我正在使用application.properties文件中指定的Spring Boot上下文路径,它工作得很好 Spring Boot 2.0及以上版本
我想实例化OrderAbstraction服务,它需要在测试用例的构造函数中使用实体管理器。 我尝试自动连接OrderAbstractionTest,并将OrderAbstraction和实体管理器作为参数。 my service.yaml,autowire设置为true 我一直收到这样的东西: PHP致命错误:Uncaught ArgumentCounter错误:函数App\Test\Order
问题内容: 有没有一种方法可以将应用程序中的node_modules目录移动到/ vendor / node_modules,例如bower对bowerrc文件的处理?我以为可以在package.json中指定它,但是我似乎找不到解决方案。非常感谢您的帮助。 问题答案: 是的,您可以,只需设置NODE_PATH env变量: 根据文档: 如果将环境变量NODE_PATH设置为用冒号分隔的绝对路径列