2017-08-09 14 views
0

私は、ProcessWire APIを使用してフックを書いています。Processwire/APIフック(関数内のPHP関数)

以下のようにすぐに私は二つの別々の送信メール機能(管理者への1つ、1にを設定するために(電子メールを送信する機能を追加すると、しかし...

$this->addHookAfter('Pages::saved', function(HookEvent $event) { 

    $arguments = $event->arguments(); 
    $page = $event->arguments(0); 

    if ($page->template == 'user') { 

     // Require relevent libraries 
     require_once($this->config->paths->root . 'api/sendgrid/sendgrid-php.php'); 

     // SendGrid API init 
     $sgAPIKey = "XXXX"; 

     // Set email confirmation settings 
     $email_admin = '[email protected]'; 
     $email_customer = $page->email; 
     $email_admin_subject = "You added a new user $page->name"; 
     $email_customer_subject = 'Your login details'; 

     $from = new \SendGrid\Email("Example User", $email_admin); 
     $subject = "Sending with SendGrid is Fun"; 
     $to = new \SendGrid\Email("Example User", $email_customer); 
     $content = new \SendGrid\Content("text/plain", "and easy to do anywhere, even with PHP"); 
     $mail = new \SendGrid\Mail($from, $subject, $to, $content); 

     $sg = new \SendGrid($sgAPIKey); 
     $response = $sg->client->mail()->send()->post($mail); 

     // Dump SendGrid object with TracyDebugger 
     bd($mail); 
    } 

}); 

を完全に正常に動作します顧客)それはまったく動作しません。何のエラーを...ちょうど$メールはNULLを返します。

$this->addHookAfter('Pages::saved', function(HookEvent $event) { 

    $arguments = $event->arguments(); 
    $page = $event->arguments(0); 

    if ($page->template == 'user') { 

     // Require relevent libraries 
     require_once($this->config->paths->root . 'api/sendgrid/sendgrid-php.php'); 

     // SendGrid API init 
     $sgAPIKey = "XXXX"; 
     // Set email confirmation settings 
     $email_admin = '[email protected]'; 
     $email_customer = $page->email; 
     $email_admin_subject = "You added a new user $page->name"; 
     $email_customer_subject = 'Your login details'; 
     $email_customer_body = 'This is a test'; 

     function send_email($from_email, $to_email, $subject, $body) { 
      global $sgAPIKey; 
      $from = new \SendGrid\Email(null, $from_email); 
      $to = new \SendGrid\Email(null, $to_email); 
      $content = new \SendGrid\Content("text/html", $body); 
      $mail = new \SendGrid\Mail($from, $subject, $to, $content); 
      $sg = new \SendGrid($sgAPIKey); 
      $response = $sg->client->mail()->send()->post($mail); 
     } 

     send_email($email_admin, $email_customer, $email_customer_subject, $email_customer_body); 

     // Dump SendGrid object with TracyDebugger 
     global $mail; 
     bd($mail); 
    } 

}); 

技術的機能は内部がありますので、このような機能は?働かない理由何らかの理由はそれがあります関数?少なくとも、エラーを返すと思ったでしょう。

答えて

0

関数内の関数はPHPで使用できますが、発生している問題はスコープに問題があります。 $mailは、その関数が完了した後、もはやその変数にアクセスできなくなったことを意味します。

一つの可能​​な解決策は、関数が完了したときに同じように、その変数を返すことです:

function send_email($from_email, $to_email, $subject, $body) { 
     global $sgAPIKey; 
     $from = new \SendGrid\Email(null, $from_email); 
     $to = new \SendGrid\Email(null, $to_email); 
     $content = new \SendGrid\Content("text/html", $body); 
     $mail = new \SendGrid\Mail($from, $subject, $to, $content); 
     $sg = new \SendGrid($sgAPIKey); 
     $response = $sg->client->mail()->send()->post($mail); 
     return $mail; 
} 

その方法は、あなたが関数を実行するとき、あなたはそれを変数に設定することができます。

脇に、globalキーワードを使用して、その$mail変数にアクセスしようとしました。それは通常、悪い習慣としてぶつかるだけでなく、この文脈では決してうまくいかないでしょう。 globalキーワードは、global名前空間内の変数にアクセス可能にするために使用されます。次のように一般的な使用である:

$global_variable = "foobar"; 
class Foo { 
    public static function test() { 
    return $global_variable; 
    } 
    public static function test_two() { 
    global $global_variable; 
    return $global_variable; 
    } 
} 
echo(Foo::test()); //echoes nothing, since in scope, the variable is not set 
echo(Foo::test_two()); //echoes 'foobar', since we told PHP to put it in scope 

TLDR:globalキーワードは、グローバルスコープ内にある変数が、ローカルスコープに表示させます。