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

Posted

技术标签:

【中文标题】Laravel 在控制器中使用非 Laravel Composer 包【英文标题】:Laravel use non-laravel composer package in controller 【发布时间】: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 命名空间的了解不够,无法解决问题。

欢迎任何帮助!

【问题讨论】:

【参考方案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 更新了答案。 解决了!非常感谢并感谢关于命名空间的课程!

以上是关于Laravel 在控制器中使用非 Laravel Composer 包的主要内容,如果未能解决你的问题,请参考以下文章

试图在 laravel 5.5 中获取非对象的属性

从laravel控制器返回json时尝试获取非对象的属性“id”

试图在laravel会话foreach中获取非对象的属性“id”

试图在laravel中获取非对象的属性'expiry_date'

如何修复“试图获取非对象的属性”Laravel 5

laravel 试图获取非对象的属性