Использование пакета, отличного от laravel, на Laravel 4


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

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

Author: Antonio Carlos Ribeiro, 2013-03-04

2 answers

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

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

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

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

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

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

СЦЕНАРИЙ 1

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

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

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

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

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

Шаг 1:

Добавить в composer.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 sdk facebook.

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

По сравнению с композитором facebook.json:

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

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

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

use Instaphp\Instaphp;

Дамп композитора - автоматическая загрузка, и это работает!

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

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

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

    }

}

Теперь снова запустите composer dump-автозапуск, и вы сможете использовать пакет. Обратите внимание, что в пакете 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!
 100
Author: stormpat, 2014-03-15 08:14:21

Добавьте "tvr/googlecheckout": "dev-master" это в свой composer.json.

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

 1
Author: conradkdotcom, 2013-03-03 21:07:01