我在Symfony2中玩DDD,我添加了以下控制器:'src'Coredomain'Companies'RestBundle'Controller'CompanyController.php
namespace Coredomain'Companies'RestBundle'Controller;
use [...] ;
class CompanyController
{
public function indexAction()
{
return $this->render('default/index.html.twig');
}
}
至于路由,我有在我的主routing.yml:
coredomain_companies_rest:
resource: "@CoredomainCompaniesRestBundle/Resources/config/routing.yml"
在'src'Coredomain'Companies'RestBundle'Resources'config'routing.yml
中:
coredomain_companies_rest_company:
resource: "@CoredomainCompaniesRestBundle/Controller/CompanyController.php"
现在当我浏览到任何页面或运行php app/console debug:router
时,我得到:
PHP Fatal error: Call to a member function addResource() on a non-object in /vagrant/coredomain/vendor/symfony/symfony/src/Symfony/Component/Routing/Loader/PhpFileLoader.php on line 45
[2015-06-09 12:03:32] php.CRITICAL: Fatal Error: Call to a member function addResource() on a non-object {"type":1,"file":"/vagrant/coredomain/vendor/symfony/symfony/src/Symfony/Component/Routing/Loader/PhpFileLoader.php","line":45,"level":-1,"stack":[]}
当我检查PhpFileLoader.php:45
时,我看到:
44| $collection = self::includeFile($path, $this);
45| $collection->addResource(new FileResource($path));
我检查了$path
变量,它包含:
'vagrant'coredomain'src'Coredomain'Companies'RestBundle'Controller'CompanyController.php
然后我检查了$collection
,它包含int(1)
。所以self::includeFile($path, $this)
返回1而不是一个对象。方法如下所示:
private static function includeFile($file, PhpFileLoader $loader)
{
return include $file;
}
基本上include $path;
返回1
或true
。这给我提出了两个问题。因为当我在那里放置一个断点时,当我删除路由并使用Symfony2附带的示例控制器时,似乎这是而不是运行。但是,当我为自己的控制器添加路由时,它确实运行。
那么我做错了什么,它为我的路由运行这部分代码?为什么这个返回1?这个PhpFileLoader不是用于类而是用于平面PHP文件吗?
谢谢。
是我的错!
coredomain_companies_rest_company:
path: /
defaults: { _controller: CoredomainCompaniesRestBundle:Company:index }
这就是路由在Symfony上的工作方式。用一个答案来解释这个问题会很长。文档对这个问题有很好的解释:http://symfony.com/doc/current/book/routing.html.
resource
是对另一个路由文件的引用,需要包含在实际的路由文件中。
如果包含的文件没有返回另一个特定的值,PHP include
也返回1。
来自PHP文档:
处理返回:include在失败时返回FALSE并引发警告。成功包含,除非被包含的文件覆盖,返回1。
:
可以在包含的文件中执行return语句,以终止该文件中的处理并返回到调用它的脚本。