【发布时间】:2016-06-22 18:25:34
【问题描述】:
我是 Symfony 的新手,但不是 PHP 的新手。我只是无法弄清楚为什么我无法从自定义捆绑包中获得主页路由,但它似乎确实可以从控制台输出中工作。当我在我的网络浏览器中执行路由时,它总是会从 AppBundle 中返回 / 路由,即默认的 Symfony 欢迎页面,即使 AppBundle 已从 AppKernal.php 中的 registerBundles() 函数中删除。我可以确认这一点,因为如果从 /src 中删除 AppBundle 目录,我将收到以下错误日志:
[2016-06-22 19:07:57] request.INFO: Matched route "homepage". {"route_parameters":{"_controller":"AppBundle\\Controller\\DefaultController::indexAction","_route":"homepage"},"request_uri":"http://bvd-v3.dev/"} []
[2016-06-22 19:07:57] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2016-06-22 19:07:57] request.CRITICAL: Uncaught PHP Exception InvalidArgumentException: "Class "AppBundle\Controller\DefaultController" does not exist." at /Users/apple/projects/mentel/bvd-v3/var/cache/prod/classes.php line 2498 {"exception":"[object] (InvalidArgumentException(code: 0): Class \"AppBundle\\Controller\\DefaultController\" does not exist. at /Users/apple/projects/mentel/bvd-v3/var/cache/prod/classes.php:2498)"} []
但是,如果我打电话给php bin/console router:match /
输出是:
+--------------+---------------------------------------------------------+
| Property | Value |
+--------------+---------------------------------------------------------+
| Route Name | homepage |
| Path | / |
| Path Regex | #^/$#s |
| Host | ANY |
| Host Regex | |
| Scheme | ANY |
| Method | ANY |
| Requirements | NO CUSTOM |
| Class | Symfony\Component\Routing\Route |
| Defaults | _controller: MentelBundle:Index:index |
| Options | compiler_class: Symfony\Component\Routing\RouteCompiler |
+--------------+---------------------------------------------------------+
如果我打电话给php bin/console debug:router
输出是:
-------------------------- -------- -------- ------ -----------------------------------
Name Method Scheme Host Path
-------------------------- -------- -------- ------ -----------------------------------
_wdt ANY ANY ANY /_wdt/{token}
_profiler_home ANY ANY ANY /_profiler/
_profiler_search ANY ANY ANY /_profiler/search
_profiler_search_bar ANY ANY ANY /_profiler/search_bar
_profiler_info ANY ANY ANY /_profiler/info/{about}
_profiler_phpinfo ANY ANY ANY /_profiler/phpinfo
_profiler_search_results ANY ANY ANY /_profiler/{token}/search/results
_profiler ANY ANY ANY /_profiler/{token}
_profiler_router ANY ANY ANY /_profiler/{token}/router
_profiler_exception ANY ANY ANY /_profiler/{token}/exception
_profiler_exception_css ANY ANY ANY /_profiler/{token}/exception.css
_twig_error_test ANY ANY ANY /_error/{code}.{_format}
homepage ANY ANY ANY /
routing.yml 的内容:
mentel:
resource: "@MentelBundle/Controller/"
type: annotation
routing_dev.yml 的内容:
_wdt:
resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
prefix: /_wdt
_profiler:
resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
prefix: /_profiler
_errors:
resource: "@TwigBundle/Resources/config/routing/errors.xml"
prefix: /_error
_main:
resource: routing.yml
/app/AppKernal.php 中registerBundles() 的内容:
public function registerBundles()
{
$bundles = [
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\SecurityBundle\SecurityBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
new Symfony\Bundle\MonologBundle\MonologBundle(),
new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
new BVD\MentelBundle\MentelBundle(),
];
if (in_array($this->getEnvironment(), ['dev', 'test'], true)) {
$bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
$bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
$bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
$bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
}
return $bundles;
}
控制器内容:
<?php
namespace BVD\MentelBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class IndexController extends Controller
{
/**
* @Route("/", name="homepage")
*/
public function indexAction()
{
die('?');
return $this->render('@mentel/pages/home.html.twig', array(
// ...
));
}
}
感谢您阅读我的问题,非常感谢您提供的任何帮助。
【问题讨论】:
-
所以我认为有并且被误解了。 @Route("/", name="homepage") 表示 hostname.de/ 如果你想要 hostname.de/ 主页的路由 @Route("/homepage", name="homepage") 你应该使用
-
我不想要
/homepage我想要从域提供的路线,即http://example.com这将是/但你说什么并不重要,因为改变路线到/something_else只会给出一个 Symfony 404。因为没有 AppBundle 路由。 -
您是否尝试过清除缓存 (
bin/console cache:clear)? -
@Oldskool - 是的,我也尝试过。输出似乎显示它没有任何问题:
[OK] Cache for the "dev" environment (debug=true) was successfully cleared. -
@Oldskool - 啊哈,你基本上完全正确。我正在运行
bin/console cache:clear,但它只清除了开发缓存,并且应用程序显然在 prod 模式下运行......我没有意识到。运行php bin/console cache:clear --env=prod为我解决了这个问题。感谢您的意见。