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 命名空间的了解不足以解决这个问题。
欢迎任何帮助!
您的控制器文件位于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来实例化您的对象。
| 归档时间: |
|
| 查看次数: |
5482 次 |
| 最近记录: |