2017-01-06 125 views
1

php-ewsを既存の非OOP Webサイトに実装しています。php-ews:クラスへのフルパスを使用しているときにクラス 'SoapClient'が見つかりません

スタンドアロンのPHPスクリプトをシェルで実行すると問題なく動作します。 (すなわちnew \jamesiarmes\PhpEws\Client

use \jamesiarmes\PhpEws\Client; 
use \jamesiarmes\PhpEws\Request\CreateItemType; 

しかし、私は、ウェブサイト上の内側のif文をuseを使用することはできませんので、私は完全なパスを使用して、すべてのクラスの先頭に追加:

スタンドアロンPHPスクリプトはuse使用しています。

このエラーが発生しました。

Fatal error: Class 'SoapClient' not found in /home/project/master/vendor/jamesiarmes/php-ntlm/src/SoapClient.php on line 13

私は、SOAP拡張機能がインストールされていることを確認しました。助けてください。ありがとう。シェルで、スタンドアロンのPHPスクリプトを実行

if ($_REQUEST['action'] == 'export-form-test') { 

    require_once 'vendor/autoload.php'; 

/* 
use \jamesiarmes\PhpEws\Client; 
use \jamesiarmes\PhpEws\Request\CreateItemType; 

use \jamesiarmes\PhpEws\ArrayType\NonEmptyArrayOfAllItemsType; 
use \jamesiarmes\PhpEws\ArrayType\NonEmptyArrayOfAttendeesType; 

use \jamesiarmes\PhpEws\Enumeration\BodyTypeType; 
use \jamesiarmes\PhpEws\Enumeration\CalendarItemCreateOrDeleteOperationType; 
use \jamesiarmes\PhpEws\Enumeration\ResponseClassType; 
use \jamesiarmes\PhpEws\Enumeration\RoutingType; 

use \jamesiarmes\PhpEws\Type\AttendeeType; 
use \jamesiarmes\PhpEws\Type\BodyType; 
use \jamesiarmes\PhpEws\Type\CalendarItemType; 
use \jamesiarmes\PhpEws\Type\EmailAddressType; 
*/ 

    // Replace this with your desired start/end times and guests. 
    $start = new DateTime('tomorrow 4:00pm'); 
    $end = new DateTime('tomorrow 5:00pm'); 

    // Set connection information. 
    $host = '*********'; 
    $username = '*******'; 
    $password = '********'; 
    //$version = Client::VERSION_2016; 

    $client = new \jamesiarmes\PhpEws\Client($host, $username, $password); 

    // Build the request, 
    $request = new \jamesiarmes\PhpEws\Request\CreateItemType(); 
    $request->SendMeetingInvitations = \jamesiarmes\PhpEws\Enumeration\CalendarItemCreateOrDeleteOperationType::SEND_ONLY_TO_ALL; 
    $request->Items = new \jamesiarmes\PhpEws\ArrayType\NonEmptyArrayOfAllItemsType(); 

    // Build the event to be added. 
    $event = new \jamesiarmes\PhpEws\Type\CalendarItemType(); 
    $event->Start = $start->format('c'); 
    $event->End = $end->format('c'); 
    $event->title = 'EWS Test Event'; 

    // Set the event body. 
    $event->Body = new \jamesiarmes\PhpEws\Type\BodyType(); 
    $event->Body->_ = 'This is the event body'; 
    $event->Body->BodyType = \jamesiarmes\PhpEws\Enumeration\BodyTypeType::TEXT; 

    // Add the event to the request. You could add multiple events to create more 
    // than one in a single request. 
    $request->Items->CalendarItem[] = $event; 

    $response = $client->CreateItem($request); 

    // Iterate over the results, printing any error messages or event ids. 
    $response_messages = $response->ResponseMessages->CreateItemResponseMessage; 
    foreach($response_messages as $response_message) { 
     // Make sure the request succeeded. 
     if ($response_message->ResponseClass != ResponseClassType::SUCCESS) { 
      $return_arr['status'] = 'error'; 
      continue; 
     } 

     // Iterate over the created events, printing the id for each. 
     foreach($response_message->Items->CalendarItem as $item) { 
      $id = $item->ItemId->Id; 
      $return_arr['status'] = 'ok'; 
     } 
    } 

} 
+0

サーバー上とマシン上のPHPバージョンは何ですか? 'vendor/autoload.php'ファイルはどこにありますか?そのソースコードを追加したりリンクしたりできますか? –

答えて

1

正常に動作します。

しかし

私は、SOAP拡張機能がインストールされていることを確認しました。

どのように確認しましたか? CLIとWebserver環境に異なるphp.iniファイルをロードしている可能性があります。

(例えば、私のUbuntuサーバで、Apacheウェブサーバで、私は両方の

/etc/php5/cli/php.ini

/etc/php5/apache2/php.iniを持っている)

+1

php-fpmは正常に再起動されていませんでしたが、CLIは問題ありませんでした。 Stupid ... =) –

1

あなたの元の質問に答えていないが、この1:

しかし、私は使用機能を使用できませんif-statementsをウェブサイト上に作成したので、フルパスを使用してすべてのクラスをプリペンドしました。新しい\ jamesiarmes \ PhpEws \ Client)。

use namespacedクラスをインポートするステートメントは、ファイルの先頭にあり、括弧の外側にあります。それらは常に "実行"されます。つまり、現在の名前空間内にエイリアスリンクを作成します(名前空間が使用されていない場合、ルート名前空間が使用されています)。永続的なものでも現在のファイルの外部にも及ぶものではありません。新しいファイルは異なるuseのインポートを持つかもしれませんが、クラスが両方のファイルで使用されている場合はインポートを繰り返さなければなりません。

具体的にはuseを使用している場合は、名前空間に関する章についてはhttp://php.net/manual/en/language.namespaces.phphttp://php.net/manual/en/language.namespaces.importing.phpを参照してください。不正コードを例注5:use

<?php 
namespace Languages; 

function toGreenlandic() 
{ 
    use Languages\Danish; 

    // ... 
} 
?> 

クラスのインポートは、コードの実行から独立しています。PHPでコード内で使用されているすべてのクラスの完全修飾名を知ることができるように、ファイルを解析するときにすでに発生しています。コードが実行されるときにのみオートロードされますが、useはファイルの先頭に置かれます。

+0

'function(){}'を使わないとどうなりますか? 'Languages'名前空間は' vendors/autoload'であらかじめロードされているものと一致しなければなりませんか? –

+0

'use'は、関数、クラス、ifブロック内では使用できません。そして、あなたは常に完全な名前空間を提供しなければならず、可能なショートカットはありません。しかし、 'use'を使用した後は、インポートされたクラスを先頭にバックスラッシュを付けずに、またはエイリアス名を付けて名前を付けて参照することができます。 – Sven

関連する問題