如何在一个控制器中多次调用symfony2中的服务
我有一个名为“sms”的服务,我需要在它的控制器中多次使用它:如何在一个控制器中多次调用symfony2中的服务,symfony,Symfony,我有一个名为“sms”的服务,我需要在它的控制器中多次使用它: $this->get('sms')->send($userCard->getUser()->getMobile(), "text to send for first time"); $this->get('sms')->send($userCard->getUser()->getMobile(), "my second text to send"); <?php publi
$this->get('sms')->send($userCard->getUser()->getMobile(), "text to send for first time");
$this->get('sms')->send($userCard->getUser()->getMobile(), "my second text to send");
<?php
public function someAction()
{
/** @var $srv \AppBundle\Sms\SmsListener */
$srv = $this->get('app.sms_listener');
// all defaults
$srv->send('1234', 'foobar');
// overwriting options
$srv->send('4321', 'barfoo', [
'Flash' => '1'
]);
}
但它总是会发送两次第一条消息,我该怎么办
class SmsListener {
private $url="http://www.smsprovider.com/URLSend.aspx?Username=adminuser&Password=addminpassword&PortalCode=6496&Flash=0&Message=%s&Mobile=%s";
public function __construct() {
}
//put your code here
public function send($mobile,$message) {
$this->url=sprintf($this->url,$message,$mobile);
$url = str_replace(" ", '%20', $this->url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$ret=curl_exec($ch);
return $ret;
}
}
您的代码在第一次调用SmsListener::send
后自动中断。这是因为您覆盖了此处使用的url模板:
$this->url=sprintf($this->url,$message,$mobile);
在此之后,不再存在占位符(%s
)。任何进一步的调用都将使用第一次运行时的url
您可以通过在函数中使用局部变量来解决此问题:
$url = sprintf($this->url, $message, $mobile);
$url = str_replace(" ", '%20', $url);
也就是说,您最好提取配置。这实际上会使服务可重用。例如:
<?php
namespace AppBundle\Sms;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SmsListener
{
/**
* @var string
*/
private $baseUrl;
/**
* @var array
*/
private $defaultOptions;
/**
* SmsListener constructor.
*
* @param string $baseUrl
* @param array $defaultOptions
*/
public function __construct($baseUrl, $defaultOptions = [])
{
$this->baseUrl = $baseUrl;
$this->defaultOptions = $defaultOptions;
}
/**
* @param string $mobile
* @param string $message
* @param array $options
*
* @return mixed
*/
public function send($mobile, $message, array $options = [])
{
$url = $this->generateUrl(array_merge($options, [
'Message' => $message,
'Mobile' => $mobile
]));
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
return curl_exec($ch);
}
/**
* @param array $options
*
* @return string
*/
private function generateUrl(array $options)
{
return $this->baseUrl . '?' . http_build_query($this->resolveOptions($options));
}
/**
* @param array $options
*
* @return array
*/
private function resolveOptions(array $options)
{
return $this->configureOptions(new OptionsResolver())->resolve($options);
}
/**
* @param OptionsResolver $resolver
*
* @return OptionsResolver
*/
private function configureOptions(OptionsResolver $resolver)
{
return $resolver
->setDefaults($this->defaultOptions)
->setRequired(['Message', 'Mobile'])
;
}
}
用法(例如控制器内部):
在函数中生成url,如下所示:
class SmsListener {
public function __construct() {
}
//put your code here
public function send($mobile,$message) {
$baseUrl=$url="http://www.smsprovider.com/URLSend.aspx?Username=adminuser&Password=addminpassword&PortalCode=6496&Flash=0&Message=%s&Mobile=%s";
$url=sprintf($baseUrl,$message,$mobile);
$url = str_replace(" ", '%20', $url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$ret=curl_exec($ch);
return $ret;
}
}
谢谢@Yoshi的回答,但我想在这里使用symfony服务paradigm@HamidAlizadeh我更新了我的答案,使之更加以符号为导向。旁注,在你的服务中有一个固定的url并不是真正的symfony风格。
class SmsListener {
public function __construct() {
}
//put your code here
public function send($mobile,$message) {
$baseUrl=$url="http://www.smsprovider.com/URLSend.aspx?Username=adminuser&Password=addminpassword&PortalCode=6496&Flash=0&Message=%s&Mobile=%s";
$url=sprintf($baseUrl,$message,$mobile);
$url = str_replace(" ", '%20', $url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$ret=curl_exec($ch);
return $ret;
}
}