我正在尝试在symfony2中获取根目录。
如果我使用:
$this->get('kernel')->getRootDir();
我收到此错误:
FatalErrorException: Error: Call to undefined method Test\Component\ClassLoader\DebugClassLoader::get()
我该如何解决这个问题?
答案 0 :(得分:18)
编辑,看到这篇文章已经引起了如此多的关注而我的位置在顶部,获取根目录的最佳方法是将其作为构造函数参数传递给您的类。您可以使用
services.yml
来执行此操作,并使用参数:
serviceName:
class: Name\Of\Your\Service
arguments: %kernel.root_dir%
然后,当框架实例化时,以下代码将为其提供根目录:
namespace Name\Of\Your;
class Service
{
public function __construct($rootDir)
{
// $rootDir is the root directory passed in for you
}
}
下面的答案的其余部分是在不使用依赖注入的情况下做旧的,糟糕的方式。
我想让每个人都知道这是服务定位器,这是反模式。任何开发人员都应该能够通过方法签名来查看类或控制器所需的功能。注入一个完整的“容器”非常通用,难以调试,不是最好的做事方式。您应该使用依赖注入容器,它允许您在应用程序的任何位置专门注入所需内容。请明确点。查看一个名为Auryn的非常棒的递归实例化依赖注入容器。在框架解析控制器/操作的位置,将其放在那里并使用容器创建控制器并改为运行该方法。繁荣!即时SOLID代码。
你是对的,使用$this->get('service')
访问服务容器。
但是,要使用$this->get()
,您需要访问get()
方法。
通过确保控制器扩展Symfony使用的基本控制器类,您可以访问此方法以及许多其他方便的方法。
确保您引用了正确的Controller基类:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class HelloController extends Controller
{
/** The Kernel should now be accessible via the container **/
$root = $this->get('kernel')->getRootDir();
}
如果您想从服务访问容器,则必须define your controller as a service。您可以在this post,this post和this post中找到有关如何执行此操作的详细信息。另一个useful link。无论哪种方式,你现在都知道要寻找什么。 This post也可能有用:
use Symfony\Component\DependencyInjection\ContainerInterface;
class MyClass
{
private $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function doWhatever()
{
/** Your container is now in $this->container **/
$root = $this->container->get('kernel')->getRootDir();
}
}
在config.yml中,定义新类型:
myclass:
class: ...\MyClass
arguments: ["@service_container"]
您可以在the docs中了解有关服务容器的更多信息。
答案 1 :(得分:11)
参数kernel.root_dir
指向app
目录。通常,要访问根目录,我是用户kernel.root_dir
/../
因此,在控制器中,您可以使用$this->container->getParameter('kernel.root_dir')."/../"
在服务定义中,您可以使用:
my_service:
class: \Path\to\class
arguments: [%kernel.root_dir%/../]
答案 2 :(得分:-5)
最好的选择是将tour class声明为services.yml文件中的服务:
services:
myclass:
class: Your\Class\Namespace\MyClass
arguments: ["@service_container"]
并适应你的类的构造函数:
use Symfony\Component\DependencyInjection\ContainerInterface
class MyClass
{
private $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
}