在RFE中有一个解决方案;使用bin命令和php版本解决问题
我正在处理一个基于Symfony 5.4和PHP 7.4的新应用程序,以测试Symfony 6中的新添加和更改。我使用控制台中的实体生成器创建了实体和CRUD,数据库创建完美。然而,生成器使用新的“attributes”(根据https://symfony.com/doc/5.4/routing.html中的约定),而不是“classic”注释。通过控制台调试以查看生成的路径,控制器中定义的任何路由都不会显示(当在开发模式下访问URL时,当然会显示404错误)。我决定用经典注释替换属性,路径显示出来,404错误消失了。但是现在,我发现生成器使用存储库通过实体管理器进行逻辑处理,当访问索引以从头开始时,我得到以下错误:
找不到类“App\Entity\Room”的实体管理器。请检查您的Doctrine配置,确保其配置为加载此实体的元数据。
调试器中显示的代码片段如下:
class RoomRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Room::class); // 这里是错误的地方 }
实体以以下方式开始:
namespace App\Entity; use App\Repository\RoomRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: RoomRepository::class)] class Room { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column()] private ?int $id = null; ...
我最担心的是,我猜我不能完全倒退到注释来重写整个CRUD,这是一项很大的工作(这正是我使用生成器想要避免的),所以肯定有关于属性的一些我忽略的东西。这里有一个我尚未修改CRUD的控制器,所以任何人都可以查看并找出为什么路由器无法找到带有这种类型注释的定义路径。
namespace App\Controller; use App\Entity\RoomFeature; use App\Form\RoomFeatureType; use App\Repository\RoomFeatureRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; #[Route('/admin/feature')] class RoomFeatureController extends AbstractController { #[Route('/', name: 'admin_room_feature_index', methods: ['GET'])] public function index(RoomFeatureRepository $roomFeatureRepository): Response { return $this->render('room_feature/index.html.twig', [ 'room_features' => $roomFeatureRepository->findAll(), ]); } ...
所有这些的问题是什么?提前感谢。
P粉1017086232024-01-11 11:51:39
我遇到了类似的情况,对我来说,这与Trait(位于src/Entity/Traits下)上的错误命名空间有关。
这个Trait甚至没有被使用,但显然它仍会导致这个错误。
P粉8603709212024-01-11 11:26:29
如第一个评论中所述,强制每个bin/console(用于make:命令)和composer命令都要通过在命令前加上php7.4来运行,这样一切都可以正常工作,但是对于“经典”注释,我没有找到在php7.4中在控制器中使用属性的方法。.php-version文件似乎只被symfony-cli用于启动开发web服务器。希望这对将来可能遇到这种情况的任何人有所帮助。