Laravel在控制器中使用非laravel composer包

时间:2015-03-19 20:36:52

标签: php laravel namespaces laravel-5

我正在尝试在Laravel控制器中使用非laravel composer包。我已经将项目添加到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返回以下错误:

  

Trait'App \ Http \ Controllers \ Abraham \ TwitterOAuth \ TwitterOAuth'未找到

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

欢迎任何帮助!

1 个答案:

答案 0 :(得分:4)

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

namespace App\Http\Controllers;

您试图使用相对类/特征名称

向控制器添加特征
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 HomeController extends Controller {

    use Abraham\TwitterOAuth\TwitterOAuth;

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

当你在一个类中使用use时,PHP会将其解释为&#34;将此特征应用于此类&#34;。我不熟悉这个库,所以我认为Abraham\TwitterOAuth\TwitterOAuth是一个特征。不是。

当你使用类定义的use 时,你要告诉PHP要在这个命名空间中使用这个类而没有名称空间前缀&#34; 。如果您从班级中删除use语句

class HomeController extends Controller {

    //use Abraham\TwitterOAuth\TwitterOAuth;
}

并将其放在namespace关键字

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

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