如何使用symfony捆绑包中的路由?

t0ybt7op  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(178)

Symfony 5.4版和PHP 7.4版。*
在一个普通的Symfony项目中,我可以创建一个带有路径(注解)的控制器,它工作得很好。现在我已经创建了一个包,并通过Composer将其放入一个测试项目中。在这个包中,我创建了一个带有方法和路径(注解)的控制器。
当我使用debug:router时,bundle的路由没有显示。我不知道如何配置这个bundle才能在它被放入的任何项目上使用控制器路由。
我可以访问Helper类,但我不知道如何将控制器与路由一起使用。

**bundle中的示例:**在我的bundle中,我有一个渲染基本分支模板的控制器:

<?php
    namespace MyWork\MyBundle\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    
    class BundlePageController extends AbstractController
    {
    /**
     * @Route("/bundle_index", name="bundle_index")
     *
     * @return Response
     */
    public function index(): Response
    {
        return $this->render('bundle_page.html.twig');
    }
}

当我找到的解决方案说,我必须绑定这个在路由器配置.但它没有工作.我已经创建了一个routes.yml在我的捆绑包和想法是导入这个routes. yml在routes.yml从项目中的捆绑包将被使用.但我不知道参数/命名,基本上我不知道把什么.
我也尝试过使用symfony文档,但我仍然很挣扎。
我必须在service.yml中加载这个控制器作为服务吗?我有点迷路了,任何帮助都很感激。

**编辑:**我在这里找到一个帖子Symfony 5 Reusable Bundles controller has no container set, did you forget to define it as a service subscriber

这里,控制器被添加到服务配置文件和路由配置文件中。我将尝试使用这个。

**EDIT:**现在我添加了以下内容
捆绑服务xml

<service 
    id="mywork_mybundle.controller.bundle_page_controller"
    class="MyWork\MyBundle\Controller\BundlePageController" 
    public="true"/>
<service 
    id="MyWork\MyBundle\Controller\BundlePageController" 
    alias="mywork_mybundle.controller.bundle_page_controller"/>

捆绑路由xml

<route 
    id="mywork_mybundle_bundle_page_controller"
    path="/bundle-page" 
    controller="mywork_mybundle.controller.bundle_page_controller"/>

现在我必须弄清楚如何使这在项目中工作。

**EDIT:**路由现在显示在debug:router中,但出现错误

我已经把routes.xml改成了yaml,因为我在项目yaml文件中导入它时遇到了问题。所以现在在bundle中我有这个routes.yaml文件:

show_list:
    path: /bundle/page/list
    controller: MyWork\MyBundle\Controller\BundlePageController::list

然而,当我尝试访问此路由时,我收到以下错误消息URI“/bundle/page/list”的控制器不可调用:无法从容器中提取控制器“MyWork\MyBundle\Controller\BundlePageController”,因为它是专用的。是否忘记使用“controller.service_arguments”标记服务?
这是否意味着它不能再读取service.xml了,因为我把routes.xml改成了yaml?就像前面说的,服务包含了true的公钥。所以它应该是public的。我不知道是什么导致了这里的问题。

**编辑:**现在,我在捆绑包服务xml中创建了以下行:

<service id="Symfony\Bundle\FrameworkBundle\Controller\AbstractController">
     <tag name="controller.abstract_controller"/>
 </service>

并将其作为参数提供给我的控制器

<service
    id="mywork_mybundle.controller.bundle_page_controller"
    class="MyWork\MyBundle\Controller\BundlePageController"
    public="true">
  <argument type="service" id="controller.abstract_controller"/>
</service>
<service
    id="MyWork\MyBundle\Controller\BundlePageController"
    alias="mywork_mybundle.controller.bundle_page_controller"/>

我的想法是,也许我必须先加载抽象控制器服务,然后把它给我的控制器。但老实说,我不知道...
现在我看到“..mycontroller...”没有容器集,您是否忘记将其定义为服务订户?

luaexgnf

luaexgnf1#

项目的config/routes.xml应该***导入***包的路由文件。下面是"How to Include External Routing Resources"中的例子:

<!-- config/routes.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
            http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <!-- loads routes from the given routing file stored in some bundle -->
        <import resource="@AcmeOtherBundle/Resources/config/routing.yml" />
    
        <!-- loads routes from the PHP annotations of the controllers
                 found in that directory -->
        <import resource="../src/Controller/" type="annotation" />
    
        <!-- loads routes from the YAML or XML files found in that directory -->
        <import resource="../legacy/routing/" type="directory" />
    
        <!-- loads routes from the YAML or XML files
                 found in some bundle directory -->
        <import resource="@AppBundle/Resources/config/routing/public/" 
             type="directory" />
    </routes>

相关问题