Подтвердить что ты не робот

Использование пакета non-laravel на Laravel 4

Можно ли включить пакет, который не был специально разработан для L4 в рамках? Если да, то как это делается? Я знаю, что мне нужно добавить пакет в мой composer.json, который добавляет его в папку vendor, но могу ли я каким-либо образом зарегистрировать его в массиве providers? нужны ли какие-либо другие шаги?

Я хотел бы использовать Google checkout package, первоначально разработанный для Yii

4b9b3361

Ответ 1

Использование сторонних композиционных пакетов с Laravel 4

Когда разработчики создают пакеты композиторов, они должны сопоставлять автоматическую загрузку с использованием стандартов PSR-0 или PSR-4. Если это не так, могут возникнуть проблемы с загрузкой пакета в вашем приложении Laravel. Стандарт PSR-0:

{
    "autoload": {
        "psr-0": { "Acme": "src/" }
    }
}

И стандарт PSR-4:

{
    "autoload": {
         "psr-4": { "Acme\\": "src/" }
    }
}

В основном вышеприведенное является стандартом для описания композитора, где искать файлы с расширением имен. Если вы не используете свои собственные пространства имен, вам не нужно ничего настраивать.

СЦЕНАРИЙ 1

Стандартные PSR-0 следующие пакеты (с классом классов автозагрузки) в Laravel

Это простой, и, например, я буду использовать facebook php sdk, который можно найти:

https://packagist.org/packages/facebook/php-sdk

Шаг 1:

Включите пакет в файл composer.json.

"require": {
    "laravel/framework": "4.0.*",
    "facebook/php-sdk": "dev-master"
}

Шаг 2:

run: composer update

Шаг 3:

Поскольку в пакете facebook используется карта классов, в которой он работает, мы можем начать использовать пакет мгновенно. (Пример кода приведен непосредственно с обычного вида. Пожалуйста, сохраните свою логику из представлений в вашем рабочем приложении.)

$facebook = new Facebook(array(
    'appId'  => 'secret',
    'secret' => 'secret'
));
var_dump($facebook); // It works!

СКЭНАРИО 2

В этом примере я буду использовать обертку из instagram php api. Здесь нужно сделать некоторые настройки, чтобы загрузить пакет. Давайте попробуем! Пакет можно найти здесь:

https://packagist.org/packages/fishmarket/instaphp

Шаг 1:

Добавить в композитор .json

"require": {
    "laravel/framework": "4.0.*",
    "fishmarket/instaphp": "dev-master"
}

Затем вы можете нормально обновить (обновление композитора)

Затем попробуйте использовать пакет, как вы делали с пакетом facebook. Опять же, это просто код в представлении.

$instagramconfig = array(
    'client_id' => 'secret',
    'client_secret'=> 'secret',
    'access_token' => 'secret'
);

$api = Instaphp::Instance(null, $instagramconfig);                
var_dump($api); // Epic fail!

Если вы попробуете приведенный выше пример, вы получите эту ошибку:

FatalErrorException: Error: Class 'Instaphp' not found in ...

Итак, нам нужно исправить эту проблему. Для этого мы можем изучить instagram composer.json, который имеет свою автозагрузку, отличную от php facebook php sdk.

"autoload": {
         "psr-0": { "Instaphp": "." }
    }

По сравнению с facebook composer.json:

"autoload": {
        "classmap": ["src"]
    }

(Composer обрабатывает различные типы автозагрузки, от файлов и карт классов до PSR. Посмотрите на свою папку vendor/composer/, чтобы увидеть, как это делается.)

Теперь нам нужно будет загрузить класс вручную. Его легко, просто добавьте это (вверху вашего контроллера, модели или вида):

use Instaphp\Instaphp;

композитор dump-autoload, и он работает!

шаг2 (необязательно)

Другой метод (если вы не хотите использовать инструкцию "use", вы можете просто сказать композитору искать файлы прямо из вашего кода. Просто измените экземпляр так:

// reference the name-spaced class straight in the code
$api = Instaphp\Instaphp::Instance(null, $instagramconfig); 
var_dump($api); // It works

Однако я предлагаю использовать оператор use, чтобы дать понять другим разработчикам (и вашему будущему "я" ), какие (внешние) классы/пакеты используются в программе.

СЦЕНАРИЙ 3

Здесь мы используем Laravels, встроенный в контейнер IOC, для регистрации поставщиков услуг. Обратите внимание, что некоторые пакеты могут не подходить для этого метода. Я буду использовать тот же пакет Instagram, что и в сценарии 2.

Быстрая и грязная

Если вам не нравятся шаблоны проектирования и поставщики услуг, вы можете связать класс следующим образом:

App::bind('Instaphp', function($app)
{
    return new Instaphp\Instaphp;
});

И вы разрешите это так.

App::make('Instaphp');

Быстрый и грязный конец

Если вы работаете над более крупным проектом и используете интерфейсы, вы, вероятно, должны абстрагировать привязки.

Шаг 1:

Создайте папку внутри папки вашего приложения, например, папку поставщиков.

app/providers

Убедитесь, что Laravel автоматически загружает эту папку, вы можете передать некоторую дополнительную информацию в composer.json, например:

"autoload": {

    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "app/providers" // this was added
    ]

},

Теперь создайте файл в новой папке Instagram.php и поместите его внутрь:

 <?php

    use Illuminate\Support\ServiceProvider;

    class InstagramServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('Instaphp', function()
        {
            return new Instaphp\Instaphp;
        });

    }

}

Теперь запустите композицию dump-autoload снова, и вы можете использовать пакет. Обратите внимание, что пакет instagram имеет final private function __construct(), это означает, что вы не можете использовать этот пакет вне исходного класса, не изменяя метод построения для публики. Я не говорю, что это хорошая практика, и я предлагаю использовать сценарий 2 в случае пакета instagram.

В любом случае, после этого вы можете использовать пакет следующим образом:

$instagramInstance = App::make('Instaphp');

$instagramconfig = array(
    'client_id' => 'secret',
    'client_secret'=> 'secret',
    'access_token' => 'secret'
 );

$instagram = new $instagramInstance();
$userfeed = $instagram->Users->feed($instagramconfig);

var_dump($userfeed); // It works!

Ответ 2

Добавьте "tvr/googlecheckout": "dev-master" к вашему composer.json.

Запустите composer install, затем вы можете использовать контейнер IoC. Некоторые примеры кода можно найти в официальных документах для Laravel 4: http://four.laravel.com/docs/ioc#basic-usage