在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();
Run Code Online (Sandbox Code Playgroud)
但是,如何从服务类获取根路径?我尝试过这种(丑陋的)方式
// 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();
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,我得到了错误:
"Call to a member function get() on null"
Run Code Online (Sandbox Code Playgroud)
为什么此解决方案不起作用?
Symfony提供了一个kernel.project_dir可以在服务容器内部使用的参数,您可以将其注入服务或从容器中获取(在控制器内部):
$this->getParameter('kernel.project_dir');
Run Code Online (Sandbox Code Playgroud)
在服务中,您只需将其注入到构造函数中即可:
class MyService
{
private $projectDir;
public function __construct(string $projectDir)
{
$this->projectDir = $projectDir;
}
}
Run Code Online (Sandbox Code Playgroud)
在您的配置中,您可能必须通过直接为此特定服务设置字符串来确保正确传递字符串:
# config/services.yaml
...
services:
...
App\MyService:
arguments:
$projectDir: '%kernel.project_dir%'
Run Code Online (Sandbox Code Playgroud)
或者,您可以将此参数绑定到变量名称,以便配置自动识别它:
# config/services.yaml
...
services:
_defaults:
...
bind:
$projectDir: '%kernel.project_dir%'
Run Code Online (Sandbox Code Playgroud)
然后,所有具有参数的服务(在该配置文件中注册)都$projectDir将从该参数获取值。
| 归档时间: |
|
| 查看次数: |
1324 次 |
| 最近记录: |