如何添加我的功能并在控制器中正确使用它?

时间:2019-02-14 01:50:41

标签: php laravel

我具有“ sendsms”功能,该功能已在我的一个控制器中使用,并且工作正常。现在,我需要知道如何使该代码的类引用在其他控制器中使用,而不是在所有控制器中复制/粘贴整个代码。 在其他问答中,他们提到了仅创建引用,但我想像使用构造函数之类那样正确地进行操作,而不仅仅是做事情,我想像现实世界中的项目那样做。

这是控制器中的代码:

    public function store(Request $request)
{
    $this->validate($request,[
        'title' => 'required|string|min:6',
        'gametype' => 'required|string|min:3',
        'description' => 'required|string|min:1|max:180',
        'price' => 'required|numeric|min:4',
        'buyyer_id' => 'required|numeric|min:1'
//            'seller_id' => 'required|numeric|min:1'
    ]);

//        return RequestModel::create([
//            'title' => $request['title'],
//            'description' => $request['description'],
//            'gametype' => $request['gametype'],
//            'price' => $request['price'],
//            'buyyer_id' => $request['buyyer_id'],
//            'seller_id' => Auth::user()->id,
//        ]);
//
    $requestModel = new RequestModel;
    // store
    $requestModel->title       = $request['title'];
    $requestModel->description      = $request['description'];
    $requestModel->gametype = $request['gametype'];
    $requestModel->price       = $request['price'];
    $requestModel->buyyer_id      = $request['buyyer_id'];
    $requestModel->seller_id = Auth::user()->id;
    $requestModel->save();

    return $this->sendSms($request['title'], $request['gametype']);


}
// I want to use this code in another class to use it in all controllers without copy/paste it.
function sendSms($reqid, $recgametype) {

    //Send sms to getway
    //implement later.

    $otp_prefix = ':';
    $response_type = 'json';

    $textMSGATLAS = iconv("UTF-8", 'UTF-8//TRANSLIT',"req : ( " .$reqid. " ) for ( " .$recgametype.  " ) submitted ");

    ini_set("soap.wsdl_cache_enabled", "0");
    try {
        $client = new SoapClient("http://xxxx");
        $user = "user";
        $pass = "pass";
        $fromNum = "+xxx";
        $toNum = "+xxxx";
        $messageContent = $textMSGATLAS;
        $op  = "send";

        $client->SendSMS($fromNum,$toNum,$messageContent,$user,$pass,$op);

    } catch (SoapFault $ex) {
        echo $ex->faultstring;
    }


}

我现在正在学习,并且我是新手,因此可以帮助您了解如何使其正常工作。谢谢。

1 个答案:

答案 0 :(得分:2)

您可以创建一个单独的SMS类,例如:

<?php 

namespace App;

class SMS {

    private $reqid;
    private $recgametype;

    public function __construct($reqid, $recgametype)
    {
        $this->reqid = $reqid;
        $this->recgametype = $recgametype;
    }

    public function send()
    {
        $otp_prefix = ':';
        $response_type = 'json';

        $textMSGATLAS = iconv("UTF-8", 'UTF-8//TRANSLIT',"req : ( " .$this->reqid. " ) for ( " .$this->recgametype.  " ) submitted ");

        ini_set("soap.wsdl_cache_enabled", "0");

        try {
            $client = new SoapClient("http://xxxx");
            $user = "user";
            $pass = "pass";
            $fromNum = "+xxx";
            $toNum = "+xxxx";
            $messageContent = $textMSGATLAS;
            $op  = "send";

            return $client->SendSMS($fromNum,$toNum,$messageContent,$user,$pass,$op);

        } catch (SoapFault $ex) {

           throw new \Exception('SMS sending failed')
        }
    }

}

然后在控制器内部或您需要的任何地方:

public function sendSms($reqid, $recgametype) {

    $sms = new \App\SMS($reqid, $recgametype);

    $sms->send();


}

您还可以在SMSSendingFailedException函数中创建诸如\Exception之类的自定义异常,并将其抛出而不是标准send()

这将帮助您在控制器中发送适当的响应,例如:

public function sendSms($reqid, $recgametype) {

    try{

        $sms = new \App\SMS($reqid, $recgametype);

        $sms->send();

        return response()->json('message' => 'SMS sent successfully', 200);
    }
    catch(SMSSendingFailedException $e){

        return response()->json('message' => 'SMS sending failed', 500);
    }


}

然后再走一步,如果整个项目中都需要laravel facade的概念,并且需要使用快速的类别名。