Laravel 在控制器中使用非 laravel 作曲家包

Laravel use non-laravel composer package in controller

我正在尝试在 Laravel 控制器中使用非 laravel 作曲家包。我已将项目添加到 composer.json 文件中,如下所示:

"require": {
    "laravel/framework": "5.0.*",
    "php": ">=5.4.0",
    "abraham/twitteroauth": "0.5.2"
},

然后我运行:

composer update

在项目中,已按预期将软件包安装在 vendor/ 目录中,我在那里看到了。但是,在控制器中添加以下代码时:

<?php
namespace App\Http\Controllers;

class HomeController extends Controller {

    use Abraham\TwitterOAuth\TwitterOAuth;

public function index()
{
    $o = new TwitterOauth();
    return view('home');
}

Laravel returns 出现如下错误:

Trait 'App\Http\Controllers\Abraham\TwitterOAuth\TwitterOAuth' not found

我怀疑这与已声明命名空间这一事实有关,但我对 PHP 命名空间的了解不足以解决此问题。

欢迎任何帮助!

您的控制器文件位于 App\Http\Controllers 命名空间

namespace App\Http\Controllers;

您试图使用相对 class/trait 名称向您的控制器添加特征

use Abraham\TwitterOAuth\TwitterOAuth;

如果您使用相对特征名称,PHP 将假定您需要当前命名空间中的特征,这就是它抱怨

的原因
App\Http\Controllers\Abraham\TwitterOAuth\TwitterOAuth

App\Http\Controllers\
combined with
Abraham\TwitterOAuth\TwitterOAuth

尝试使用绝对特征名称,应该没问题

use \Abraham\TwitterOAuth\TwitterOAuth;

或者,将 TwitterOAuth 导入当前命名空间

namespace App\Http\Controllers;
use Abraham\TwitterOAuth\TwitterOAuth;

然后与短名称一起使用

class HomeController extends Controller {

    use TwitterOAuth;
}

更新

好吧,我们要怪PHP在这里重复使用use。在你的 class 定义中,你说

class HomeController extends Controller {

    use Abraham\TwitterOAuth\TwitterOAuth;

    public function index()
    {
        $o = new TwitterOauth();
        return view('home');
    }
}

当您在 class 中使用 use 时,PHP 会将其解释为 "apply this trait to this class"。我不熟悉图书馆,所以我认为 Abraham\TwitterOAuth\TwitterOAuth 是一个特征。不是。

当您在 class 定义的 use 外部使用 时,您是在告诉 PHP 到 "use this class in this namespace without a namespace prefix"。如果您从 class

中删除 use 语句
class HomeController extends Controller {

    //use Abraham\TwitterOAuth\TwitterOAuth;
}

并将其放在外面,namespace 关键字

namespace App\Http\Controllers;
use Abraham\TwitterOAuth\TwitterOAuth;

您应该能够使用 class TwitterOAuth 来实例化您的对象。