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

BnM*_*McG 5 php namespaces laravel laravel-5

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

"require": {
    "laravel/framework": "5.0.*",
    "php": ">=5.4.0",
    "abraham/twitteroauth": "0.5.2"
},
Run Code Online (Sandbox Code Playgroud)

然后我跑了:

composer update
Run Code Online (Sandbox Code Playgroud)

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

<?php
namespace App\Http\Controllers;

class HomeController extends Controller {

    use Abraham\TwitterOAuth\TwitterOAuth;

public function index()
{
    $o = new TwitterOauth();
    return view('home');
}
Run Code Online (Sandbox Code Playgroud)

Laravel 返回以下错误:

未找到特性“App\Http\Controllers\Abraham\TwitterOAuth\TwitterOAuth”

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

欢迎任何帮助!

Ala*_*orm 5

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

namespace App\Http\Controllers;
Run Code Online (Sandbox Code Playgroud)

您尝试使用相对类/特征名称向控制器添加特征

use Abraham\TwitterOAuth\TwitterOAuth;
Run Code Online (Sandbox Code Playgroud)

如果您使用相对 trait 名称,PHP 会假设您想要当前命名空间中的trait ,这就是它抱怨的原因

App\Http\Controllers\Abraham\TwitterOAuth\TwitterOAuth
Run Code Online (Sandbox Code Playgroud)

或者

App\Http\Controllers\
combined with
Abraham\TwitterOAuth\TwitterOAuth
Run Code Online (Sandbox Code Playgroud)

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

use \Abraham\TwitterOAuth\TwitterOAuth;
Run Code Online (Sandbox Code Playgroud)

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

namespace App\Http\Controllers;
use Abraham\TwitterOAuth\TwitterOAuth;
Run Code Online (Sandbox Code Playgroud)

然后与短名称一起使用

class HomeController extends Controller {

    use TwitterOAuth;
}
Run Code Online (Sandbox Code Playgroud)

更新

好的,我们要责怪 PHP 对use这里的双重使用。在你的类定义中,你说

class HomeController extends Controller {

    use Abraham\TwitterOAuth\TwitterOAuth;

    public function index()
    {
        $o = new TwitterOauth();
        return view('home');
    }
}
Run Code Online (Sandbox Code Playgroud)

当您use在类中使用时,PHP 会将其解释为“将此特性应用于此类”。我不熟悉图书馆,所以我认为这Abraham\TwitterOAuth\TwitterOAuth是一个特征。它不是。

当您use 类定义之外使用时,您是在告诉 PHP“在没有命名空间前缀的情况下在这个命名空间中使用这个类”。如果您use从班级中删除该语句

class HomeController extends Controller {

    //use Abraham\TwitterOAuth\TwitterOAuth;
}
Run Code Online (Sandbox Code Playgroud)

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

namespace App\Http\Controllers;
use Abraham\TwitterOAuth\TwitterOAuth;
Run Code Online (Sandbox Code Playgroud)

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