【问题标题】:Laravel use non-laravel composer package in controllerLaravel 在控制器中使用非 Laravel Composer 包
【发布时间】:2015-05-23 03:41:36
【问题描述】:

我正在尝试在 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 返回以下错误:

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

我怀疑这与命名空间已经声明有关,但我对 PHP 命名空间的了解不够,无法解决问题。

欢迎任何帮助!

【问题讨论】:

    标签: php laravel namespaces laravel-5


    【解决方案1】:

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

    namespace App\Http\Controllers;
    

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

    use Abraham\TwitterOAuth\TwitterOAuth;
    

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

    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 将其解释为“将此特征应用于此类”。我不熟悉这个库,所以我认为Abraham\TwitterOAuth\TwitterOAuth 是一个特征。它不是。

    当您在类定义之外使用use outside 时,您是在告诉 PHP “在此命名空间中使用该类而无需命名空间前缀”。如果您从班级中删除 use 语句

    class HomeController extends Controller {
    
        //use Abraham\TwitterOAuth\TwitterOAuth;
    }
    

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

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

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

    【讨论】:

    • 使用绝对名称时,我收到错误:未找到 Trait 'Abraham\TwitterOAuth\TwitterOAuth'。有没有我遗漏的步骤?
    • @BnMcG 好的,所以至少它现在抱怨正确的课程。该错误听起来像是 PHP 尝试自动加载 Abraham\TwitterOAuth\TwitterOAuth,但找不到类。运行“composer dumpautoload”可能会解决这个问题,但是当您运行“composer update”时应该会自动发生这种情况。 Abraham\TwitterOAuth\TwitterOAuth 是否列在 vendor/composer/autoload_psr4.php 中?
    • 我在本地机器上运行composer update命令后在VM上运行然后上传,错误变为:“App\Http\Controllers\HomeController cannot use Abraham\TwitterOAuth\TwitterOAuth -它不是特征”... autoload_psr4.php 包含以下行:“'Abraham\\TwitterOAuth\\' => array($vendorDir . '/abraham/twitteroauth/src')”,所以我猜它在那里列出正确。
    • @BnMcG 更新了答案。
    • 解决了!非常感谢并感谢关于命名空间的课程!
    猜你喜欢
    • 2017-10-04
    • 1970-01-01
    • 2014-07-29
    • 2014-07-03
    • 1970-01-01
    • 2016-08-13
    • 2016-09-11
    • 2016-05-25
    • 2013-02-25
    相关资源
    最近更新 更多