我已经安装https://packagist.org/packages/pusher/pusher-php-server使用composer和am 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连接代码都在它自己的类中,所以我在下面它自己的命名空间中创建了这个类,并将其保存为Smawt/Helpers目录中的PusherConnect.php:
<?php
namespace SmawtHelpers;
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 SmawtHelpersPusherConnect;
$pusher = new PusherConnect($app);
但我遇到了
Fatal error: Class 'SmawtHelpersPusher' not found in C:Users...PusherConnect.php on line 13
因此,我意识到pusher php服务器类没有名称空间,因为Composer生成的autoload_psr4.php文件中没有提到pusher名称空间。因此,我编辑了供应商提供的Pusher.php文件:
namespace Pusher;
class PusherException extends Exception
{
}
class Pusher
{ ...
和我自己的PusherConnect类
public function __construct($app)
{
$this->app = $app;
$pusher = new PusherPusher(
一切都开始工作了。
这个问题似乎与从我自己的类中实例化非名称空间的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将尝试在这个命名空间下查找该类:SmawtHelpers
,并将以"未找到类"失败,因为SmawtHelpersPusher
不存在于这个命名空间中-没有映射。
通过在前缀中加上前导反斜杠new Pusher
,您指的是命名空间类中的全局命名空间。另一种选择是将use语句添加到顶部的use Pusher;
,然后仅添加到$obj = new Pusher
。
这两者都会起作用,因为Composer会在提取包之后生成自动加载文件,并且要提取的包定义了一个基于类映射的自动加载:"classmap": [ "lib/" ]
。因此,类Pusher
映射到/vendor/pusher/pusher-php-server/lib/Pusher.php
。
a) 带前导反斜杠的前缀
namespace SmawtHelpers;
class PusherConnect
{
protected $app;
public function __construct($app)
{
$this->app = $app;
$pusher = new Pusher(
a) 使用报表
namespace SmawtHelpers;
use Pusher;
class PusherConnect
{
protected $app;
public function __construct($app)
{
$this->app = $app;
$pusher = new Pusher(
如果您想修改Composer带来的库并保留更改(但不向该包提交拉取请求),请将其移到vendor
目录之外,并开始使用版本控制系统跟踪它。不利的一面(以及为什么人们不经常这样做)是,现在对该包进行的任何错误修复或改进都必须由您手动处理。
PSR-4自动加载和命名空间似乎将出现在Pusher Library的下一个版本中。与此同时,我遵循了How to require a fork with composer的建议,创建了我自己的Pusher Library fork,然后更新了我的composer.json,要求使用我命名的github的分支版本。