Symfony2 全局函数
例如,我有算法函数,它计算特定的哈希代码。函数本身是300多行代码。我需要在捆绑包中的许多不同的控制器中多次使用该函数。我可以在哪里存储我的在我的捆绑包中使用它?我可以从其他捆绑包访问它吗?我也可以写全局谁有权访问实体管理器?calculate_hash()
calculate_hash()
在这里没有找到我的答案。
例如,我有算法函数,它计算特定的哈希代码。函数本身是300多行代码。我需要在捆绑包中的许多不同的控制器中多次使用该函数。我可以在哪里存储我的在我的捆绑包中使用它?我可以从其他捆绑包访问它吗?我也可以写全局谁有权访问实体管理器?calculate_hash()
calculate_hash()
在这里没有找到我的答案。
在Symfony2世界中,这显然属于一种服务。服务实际上是绑定到依赖关系注入容器的正常类。您可以向他们注入所需的依赖项。例如,假设函数所在的类是 。该服务具有“全局”功能。你定义你的类是这样的:calculate_hash
AlgorithmicHelper
namespace Acme\AcmeBundle\Helper;
// Correct use statements here ...
class AlgorithmicHelper {
private $entityManager;
public function __construct(EntityManager $entityManager) {
$this->entityManager = $entityManager;
}
public function calculate_hash() {
// Do what you need, $this->entityManager holds a reference to your entity manager
}
}
然后需要让这个类意识到symfony依赖性容器。为此,您可以通过添加如下部分来定义文件中的服务:app/config/config.yml
service
services:
acme.helper.algorithmic:
class: Acme\AcmeBundle\Helper\AlgorithmicHelper
arguments:
entityManager: "@doctrine.orm.entity_manager"
在服务正下方,是服务 ID。例如,它用于在控制器中检索服务。之后,指定服务的类,然后指定要传递给该类的构造函数的参数。表示法表示传递对 id 为 的服务的引用。@
doctrine.orm.entity_manager
然后,在控制器中,执行类似如下操作来检索服务并使用它:
$helper = $this->get('acme.helper.algorithmic');
$helper-> calculate_hash();
请注意,调用 的结果将始终返回帮助程序的同一实例。这意味着,默认情况下,服务是唯一的。这就像有一个单例类。$this->get('acme.helper.algorithmic')
有关更多详细信息,我邀请您阅读Symfony2书。还要检查这些链接
希望它有帮助。
问候,
马特
Braian在评论中要求Symfony 3的答案,所以这里有一个Symfony 3.3(2017年5月发布):
namespace Acme\AcmeBundle\Helper;
use Doctrine\ORM\EntityManager;
final class AlgorithmicHelper
{
/**
* @var EntityManager
*/
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function calculateHash()
{
// Do what you need, $this->entityManager holds a reference to your entity manager
}
}
# app/config/services.yml
services:
_defaults: autowire # this enabled constructor autowiring for all registered services
Acme\AcmeBundle\Helper\AlgorithmicHelper: ~
use Acme\AcmeBundle\Helper\AlgorithmicHelper;
class SomeController
{
/**
* @var AlgorithmicHelper
*/
private $algorithmicHelper;
public function __construct(AlgorithmicHelper $algorithmicHelper)
{
$this->algorithmicHelper = $algorithmicHelper;
}
public function someAction()
{
// some code
$hash = $this->algorithmicHelper->calculateHash();
// some code
}
}
您可以在以下2篇文章中阅读有关Symfony 3.3依赖注入(在本例中注册服务并在控制器中使用它)的新闻: