2015-11-05 2 views
2

я пытаюсь включить следующий код в файле контроллера Symfony:Использование перегруженного глобального класса в контроллере Symfony

namespace { 
    class LocalSoapClient extends \SoapClient { 
     function __doRequest($request, $location, $action, $version) { 
      //............... 
     } 
    } 
} 
namespace .....\Controller { 
    //....... 
} 

В классе контроллера я пытаюсь использовать перегруженный класс:

$service = new \LocalSoapClient($wsdl); 

С \, класс должен находиться в глобальном пространстве имен. Но я получаю ошибку:

Class 1\LocalSoapClient does not exist in .......\FrontBundle/Controller/ 

Почему?

Если я использую одну команду пространства имен, и я перегружаю класс перед классом контроллера, я получаю такую ​​же ошибку.

Что я могу сделать, чтобы использовать мой перегруженный класс?

Заранее спасибо

+0

Почему вы чувствуете необходимость иметь LocalSoapClient определяется в глобальном пространстве имен? Вы пытаетесь использовать его у другого контроллера? Ваш опубликованный выглядит так, как будто он должен работать. Вы, очевидно, упростили этот вопрос, и, возможно, у вас есть опечатка. 1 в «Class 1 \ LocalSoapClient» очень запутан, рассмотрите возможность копирования/вставки точного сообщения об ошибке и кода. В любом случае LocalSoapClient должен, вероятно, быть сервисом. – Cerad

ответ

0

Есть 2 DON'Ts что вы нарушающие:

  1. НЕ помещайте более одного класса в один файл.
  2. НЕ смешивайте пространства имен. Причина в том, что Symfony использует автозагрузку PSR-0/-4, и то, что вы пытаетесь сделать, не может работать.

Решение состоит в том, чтобы просто создать отдельные файлы с соответствующими пространствами имен.

Поместите следующее в src/Your/SomethingBundle/Soap (или там, где вы хотели файл жить):

<?php 

namespace Your\SomethingBundle\Soap; 

class LocalSoapClient extends \SoapClient 
{ 
    // … 
} 

И ваш контроллер должен просто выглядеть следующим образом:

<?php 

namespace Your\SomethingBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Your\SomethingBundle\Soap\LocalSoapClient; 

class MyController extends Controller 
{ 
    public function myAction() 
    { 
     $soapClient = new LocalSoapClient(); 
     // … 
    } 
} 
+0

Спасибо. Я новичок в Symfony, но я предполагал, что общие принципы PHP, такие как использование \ для доступа к глобальному пространству имен, по-прежнему применимы. – Lmalt

+0

Да, \ для глобальных классов. Однако у вас смешанные пространства имен внутри файла, и это не рекомендуется. Честно говоря, я не знаю, что именно делает реализация PSR-0 Symfony для разрешения пространств имен, но этот тип кода обычно включает в себя много магии. В любом случае, вы должны всегда помещать каждый класс в отдельный файл, а путь к файлу всегда должен соответствовать пространству имен. * Особенно, если вы новичок в Symfony. – lxg

Смежные вопросы