在Symfony 4中,可以从控制器中通过以下命令获取项目的根路径:
// From a Controller Class, in the src/Controller dir
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// ...
Class myController extends Controller{
// ...
// in a public method
$rootDir = $this->get('kernel')->getRootDir();
但是如何从服务类获取根路径? 我尝试过这种(丑陋的)方式
// From a Service Class, in the src/Service dir
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// ...
Class myService extends Controller{
// ...
// in a public method
$rootDir = $this->get('kernel')->getRootDir();
但是当我这样做时,我得到了错误:
"Call to a member function get() on null"
为什么此解决方案不起作用?还有更合适的方法吗?
感谢您的帮助:)
答案 0 :(得分:4)
Symfony提供了一个参数kernel.project_dir
,该参数可以在服务容器内部使用,您可以将其注入服务或从容器中获取(在控制器内部):
$this->getParameter('kernel.project_dir');
在服务中,您只需将其注入到构造函数中即可:
class MyService
{
private $projectDir;
public function __construct(string $projectDir)
{
$this->projectDir = $projectDir;
}
}
在您的配置中,您可能必须通过直接为此特定服务设置字符串来确保正确传递字符串:
# config/services.yaml
...
services:
...
App\MyService:
arguments:
$projectDir: '%kernel.project_dir%'
或者,您可以将此参数绑定到变量名称,以便配置自动识别它:
# config/services.yaml
...
services:
_defaults:
...
bind:
$projectDir: '%kernel.project_dir%'
然后,所有具有参数$projectDir
的服务(在该配置文件中注册)将从该参数获取值。
答案 1 :(得分:3)
我的方法是相同的,但是您可以将ParameterBaginterface注入构造函数中,因此您可以访问所有参数。
因此,您不必定义服务,因为自动装配使您的生活更加轻松。
orElseThrow()
现在您可以通过$ this-> parameterBag-> get('your_parameter');
访问参数