我已经使用composer安装了https://packagist.org/packages/pusher/pusher-php-server,并且我的应用程序中的所有软件包都是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 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类没有命名空间,因为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 \Pusher\Pusher(
所有人都开始工作了。
问题似乎与从我自己的类中实例化非命名空间的Pusher类有关,该类是命名空间的。 所以,我的问题是“我如何阻止Composer覆盖我的更改,下次我更新作曲家,以及为什么我无法通过引用我自己的全局命名空间来避免编辑Composer安装的包类?”例如在我自己的PusherConnect类
中public function __construct($app)
{
$this->app = $app;
$pusher = new \Pusher(
顺便说一下,Pusher Library似乎一度被命名,但不再是:https://github.com/pusher/pusher-http-php/commit/fea385ade9aede97b37267d5be2fce59d0f1b09d
提前致谢
答案 0 :(得分:2)
问题似乎与从我自己的类中实例化非命名空间的Pusher类有关,该类是命名空间。
似乎你已经通过要求命名空间分支来解决它,但无论如何:
如果在命名空间类中使用new Pusher
,则PHP将尝试在此命名空间下找到该类:Smawt\Helpers\
并且将失败,而#34;未找到类&#34;,因为{ <1}}并不存在于此命名空间内 - 没有映射。
通过前缀前导反斜杠Smawt\Helpers\Pusher
,您指的是命名空间类中的全局命名空间。另一种方法是在顶部new \Pusher
添加一个use语句,然后只添加use \Pusher;
。
两者都可以工作,因为Composer会在获取包之后生成自动加载文件,而您提取的包定义了基于类图的自动加载:$obj = new Pusher
。因此,课程"classmap": [ "lib/" ]
会映射到Pusher
。
a)带前导反斜杠的前缀
/vendor/pusher/pusher-php-server/lib/Pusher.php
a)use-statment
namespace Smawt\Helpers;
class PusherConnect
{
protected $app;
public function __construct($app)
{
$this->app = $app;
$pusher = new \Pusher(
答案 1 :(得分:1)
如果要修改随Composer引入的库并保留更改(但不向该程序包提交拉取请求),请将其移到vendor
目录之外,然后开始使用版本控制系统跟踪它。缺点(以及为什么人们不经常这样做)现在是任何错误修正或对该包进行的改进必须由您手动处理。
答案 2 :(得分:1)
似乎PSR-4自动加载和命名空间将出现在Pusher Library的下一个版本中。 在此期间,我按照How to require a fork with composer的建议创建了自己的Pusher库分支,然后更新了我的composer.json,要求从github获取这个分支版本,我已将其命名为。