Я установил https://packagist.org/packages/pusher/pusher-php-server использую composer и запускаю PSR-4 для всех пакетов в моем приложении.
Мне удалось успешно подключиться к Pusher API с помощью базового кода, вызываемого со страницы, где не было упомянуто «использовать пространство имен»:
$pusher = new Pusher(
$app->config->get('pusher.api-key'),
$app->config->get('pusher.api-secret'),
$app->config->get('pusher.app-id'),
array('encrypted' => true)
);
Я решил, что мне нужен весь код подключения Pusher в его собственном классе, поэтому я создал класс ниже в его собственном пространстве имен и сохранил его как PusherConnect.php в каталоге Smawt / Helpers:
<?php
namespace Smawt\Helpers;
class PusherConnect
{
protected $app;
public function __construct($app)
{
$this->app = $app;
$pusher = new Pusher(
$this->app->config->get('pusher.api-key'),
$this->app->config->get('pusher.api-secret'),
$this->app->config->get('pusher.app-id'),
array('encrypted' => true)
);
$results = $pusher->get_channels( array( 'filter_by_prefix' => 'user_') );
$channel_count = count($results->channels);
$this->app->view->appendData([
'channels_count' => $channel_count
]);
$pusher->channel_count = $channel_count;
return $pusher;
}
public function check()
{
if (!$this->app->config->get('pusher.api-key')) {
$this->app->flash('global', 'No Pusher account has been set up.');
return $this->app->response->redirect($this->app->urlFor('home'));
}
}
}
Затем я создал объект с
<?php
use Smawt\Helpers\PusherConnect;
$pusher = new PusherConnect($app);
но меня встретили
Fatal error: Class 'Smawt\Helpers\Pusher' not found in C:\Users\...\PusherConnect.php on line 13
Итак, я понял, что классы pusher-php-server не были пространством имен, поскольку пространства имен Pusher не были упомянуты в сгенерированном Composer файле autoload_psr4.php. Итак, я отредактировал предоставленный поставщиком файл Pusher.php:
namespace Pusher;
class PusherException extends \Exception
{
}
class Pusher
{ ...
и мой собственный класс PusherConnect
public function __construct($app)
{
$this->app = $app;
$pusher = new \Pusher\Pusher(
и все начали работать.
Проблема, по-видимому, связана с созданием экземпляра класса Pusher без пространства имен из моего собственного класса, который является пространством имен.
Итак, мой вопрос: «Как я могу предотвратить переписывание Composer моих изменений при следующем обновлении Composer, а также, почему я не могу избежать этого редактирования установленного пакета Composer, ссылаясь на глобальное пространство имен из моего собственного учебный класс?» такой как в моем собственном классе PusherConnect
public function __construct($app)
{
$this->app = $app;
$pusher = new \Pusher(
Между прочим, похоже, что библиотека Pusher была когда-то пространством имен, но больше не является: https://github.com/pusher/pusher-http-php/commit/fea385ade9aede97b37267d5be2fce59d0f1b09d
заранее спасибо
Проблема, по-видимому, связана с созданием экземпляра класса Pusher без пространства имен из моего собственного класса, который является пространством имен.
Кажется, вы уже решили эту проблему, запросив ветку с пространством имен, но в любом случае:
Если вы используете new Pusher
в классе пространства имен, PHP попытается найти класс в этом пространстве имен: Smawt\Helpers\
и потерпит неудачу с «Класс не найден», потому что Smawt\Helpers\Pusher
не существует в этом пространстве имен — нет отображения.
Префиксом с ведущей обратной косой чертой new \Pusher
вы ссылаетесь на глобальное пространство имен внутри вашего пространства имен. Альтернативой было бы добавить оператор использования в начало use \Pusher;
а потом просто $obj = new Pusher
,
Оба будут работать, потому что Composer генерирует файлы автозагрузки, после того, как пакет получен, а пакет, который вы выбираете, определяет автозагрузку на основе карты классов: "classmap": [ "lib/" ]
, Итак, класс Pusher
карты для /vendor/pusher/pusher-php-server/lib/Pusher.php
,
а) префикс с ведущей обратной косой чертой
namespace Smawt\Helpers;
class PusherConnect
{
protected $app;
public function __construct($app)
{
$this->app = $app;
$pusher = new \Pusher(
а) использование-статус
namespace Smawt\Helpers;
use \Pusher;
class PusherConnect
{
protected $app;
public function __construct($app)
{
$this->app = $app;
$pusher = new Pusher(
Если вы хотите изменить библиотеку, поставляемую с Composer, и сохранить изменения (но не отправлять запрос на извлечение для этого пакета), переместите ее за пределы vendor
каталог и начать отслеживать его с вашей системой контроля версий. Недостатком (и почему люди не часто делают это) является то, что любые исправления или улучшения, сделанные в этом пакете, должны быть обработаны вами вручную.
Похоже, что автозагрузка PSR-4 и пространства имен должны появиться в следующем выпуске библиотеки Pusher.
В то же время я последовал совету в Как потребовать форк с композитором и создал мой собственный форк библиотеки Pusher, а затем обновил мой composer.json, чтобы потребовать эту разветвленную версию от github, который у меня был в пространстве имен.