2015-03-19 2 views
3

Я пытаюсь использовать пакет non-laravel composer в контроллере Laravel. Я добавил проект в файл composer.json так:Laravel использовать не-laravel композиционный пакет в контроллере

"require": { 
    "laravel/framework": "5.0.*", 
    "php": ">=5.4.0", 
    "abraham/twitteroauth": "0.5.2" 
}, 

Я побежал:

composer update 

В рамках проекта, который установил пакет в поставщика/каталога, как и ожидалось, и я вижу это там. Однако, при добавлении следующего кода в контроллер:

<?php 
namespace App\Http\Controllers; 

class HomeController extends Controller { 

    use Abraham\TwitterOAuth\TwitterOAuth; 

public function index() 
{ 
    $o = new TwitterOauth(); 
    return view('home'); 
} 

Laravel возвращает следующую ошибку:

Trait 'App\Http\Controllers\Abraham\TwitterOAuth\TwitterOAuth' not found

Я подозреваю, что это что-то делать с тем, что пространство имен уже объявлена, но я не знаю достаточно о пространствах имен PHP, чтобы решить проблему.

Любая помощь была бы рада!

ответ

4

Файл контроллера находится в App\Http\Controllers пространства имен

namespace App\Http\Controllers; 

Вы пытались добавить черту к контроллеру, используя относительное имя класса/признак

use Abraham\TwitterOAuth\TwitterOAuth; 

Если вы используете относительное имя признака, PHP предположит, что вам нужна черта в текущем пространстве имен, поэтому он жалуется на

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; 
} 

Update:

ОК, мы получаем обвинить двойное использование РНР из use здесь. В определении вашего класса, вы сказали

class HomeController extends Controller { 

    use Abraham\TwitterOAuth\TwitterOAuth; 

    public function index() 
    { 
     $o = new TwitterOauth(); 
     return view('home'); 
    } 
} 

При использовании use внутри класса, PHP интерпретирует, что как «применить эту черту к этому классу». Я не знаком с библиотекой, поэтому я предположил, что Abraham\TwitterOAuth\TwitterOAuth - это черта. Это не.

Когда вы используете useза пределами определения класса, вы говорите PHP, чтобы «использовать этот класс в этом пространстве имен без префикса пространства имен».Если удалить use заявление от вашего класса

class HomeController extends Controller { 

    //use Abraham\TwitterOAuth\TwitterOAuth; 
} 

и поместить его на улице, под namespace ключевого слова

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

Вы должны быть в состоянии использовать класс TwitterOAuth инстанцировать свои объекты.

+0

При использовании абсолютного имени я получаю сообщение об ошибке: Trait 'Abraham \ TwitterOAuth \ TwitterOAuth' не найден. Есть какой-то шаг, который я пропустил где-то? – BnMcG

+0

@BnMcG Итак, по крайней мере, он жалуется на правильный класс сейчас. Эта ошибка заставляет это звучать так, как PHP пытается автоматически загрузить Abraham \ TwitterOAuth \ TwitterOAuth, но не находит никакого класса. Запуск «composer dumpautoload» может исправить это, но это должно было произойти автоматически при запуске «обновления для композитора». Является ли Abraham \ TwitterOAuth \ TwitterOAuth указанным в поставщике/композиторе/autoload_psr4.php? –

+0

Я запустил команду обновления композитора на виртуальной машине после ее запуска на моем локальном компьютере, а затем загрузился, и ошибка изменилась на: «Приложение \ Http \ Controllers \ HomeController не может использовать Abraham \ TwitterOAuth \ TwitterOAuth - это не черта». .. autoload_psr4.php содержит следующую строку: «'Abraham \\ TwitterOAuth \\' => array ($ vendorDir. '/ abraham/twitteroauth/src')", поэтому я думаю, что он указан там правильно. – BnMcG

Смежные вопросы