我试图弄清楚如何手动注入参数DefaultController
(没有自动装配)。我发现有两种方法可以实现这一目标。
我可以使用arguments
:
services:
_defaults:
autowire: false
autoconfigure: true
public: true
App\Service\SomeService: ~
App\Controller\DefaultController:
arguments: #!
$service: '@App\Service\SomeService'
$scalar: 22
Run Code Online (Sandbox Code Playgroud)
与此同时,我可以使用bind
密钥:
services:
_defaults:
autowire: false
autoconfigure: true
public: true
App\Service\SomeService: ~
App\Controller\DefaultController:
bind: #!
$service: '@App\Service\SomeService'
$scalar: 22
Run Code Online (Sandbox Code Playgroud)
我的控制器:
class DefaultController extends Controller
{
public function __construct($service, $scalar)
{
var_dump(get_class($service), $scalar);
}
...
Run Code Online (Sandbox Code Playgroud)
这两个选项产生相同的输出:
string(23) "App\Service\SomeService" int(22)
那么究竟是什么这两个配置项之间的差异arguments
和bind
,他们做同样的事情?
我发现有两个选项可以在 Linux (Ubuntu 16.04) 中全局安装 PHP 包:
使用composer
:
composer global require symfony/finder
Run Code Online (Sandbox Code Playgroud)
包裹将位于 ~/.config/composer/vendor/
使用apt-get
:
apt-get install php-symfony-finder
Run Code Online (Sandbox Code Playgroud)
包裹将位于 /usr/share/php/
此目录/usr/share/php/
也在默认 PHP 中include_path
(我有 PHP 7.2)
我有几个问题:
为什么我要全局安装包?
我知道全局安装 php 工具很有用,比如phpunit
- 它有二进制文件,它允许你在任何地方运行测试,所以你不必在每个项目中安装它。但是symfony/finder
例如呢?全局安装的这个包有什么特殊用途?
1 和 2 选项有什么区别?
它有什么不同的用例或不同的效果吗?