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控制器返回json时尝试获取非对象的属性“id”
试图在laravel会话foreach中获取非对象的属性“id”