Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在一个控制器中多次调用symfony2中的服务_Symfony - Fatal编程技术网

如何在一个控制器中多次调用symfony2中的服务

如何在一个控制器中多次调用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

我有一个名为“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

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;
        }

    }