在Laravel 4上使用非laravel包

是否可以在框架中包含一个不是专门为L4devise的软件包? 如果是这样,那怎么办? 我知道我需要将该包添加到我的composer.json ,它将其添加到vendor文件夹,但我可以在providers数组中注册它? 还有其他必要的步骤吗?

我想使用最初为Yiidevise的Google checkout软件包

与Laravel 4一起使用第三方composer php软件包

当开发人员创buildComposer软件包时,他们应该使用PSR-0或PSR-4标准来映射自动加载。 如果情况并非如此,则可能会在Laravel应用程序中加载该程序包时出现问题。 PSR-0标准是:

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

而PSR-4标准:

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

基本上讲,这是一个告诉composer php在哪里寻找名字间隔文件的标准。 如果你不使用你自己的命名空间,你不必configuration任何其他的东西。

情景1

在Laravel中使用PSR-0标准包(带自动加载类映射)

这是一个简单的例子,我会使用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的包装器。 在这里需要做一些调整来获取包装。 试一试吧! 该包可以在这里find:

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

步骤1:

添加到composer php.json

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

然后你可以正常更新(composer php更新)

接下来尝试像使用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,它的自动加载不像facebook php sdk。

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

与facebook composer.json相比:

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

(composer php处理不同types的自动加载,从文件和class级地图到PSR。看看你的vendor/composer/文件夹,看看它是如何完成的。

现在我们将不得不手动加载这个类。 它很容易,只需添加(控制器,模型或视图的顶部):

 use Instaphp\Instaphp; 

composer php转储自动加载,它的工作原理!

第二步(可选)

另一种方法是(如果你不想使用“use”语句,你可以直接告诉作曲者直接从你的代码中查找文件,只需要像这样更改实例:

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

不过,我build议使用use语句向其他开发人员(以及将来的自己)清楚程序中使用的是什么(外部)类/包。

情景3

这里我们使用IOC容器中的Laravels来注册服务提供者。 请注意,有些软件包可能不适合这种方法。 我将使用与场景2中相同的Instagram包。

快速和肮脏

如果你不关心devise模式和服务提供者,你可以像这样绑定一个类:

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

你就这样解决它。

 App::make('Instaphp'); 

快速和肮脏的结局

如果您正在开发一个更大的项目,并且使用了接口,那么您应该进一步提取绑定。

步骤1:

在您的应用程序文件夹内创build一个文件夹,例如“providers”文件夹。

 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的新文件夹中创build一个文件,并将其放在里面:

  <?php use Illuminate\Support\ServiceProvider; class InstagramServiceProvider extends ServiceProvider { public function register() { $this->app->bind('Instaphp', function() { return new Instaphp\Instaphp; }); } } 

现在运行composer dump-autoload,你可以使用这个包。 请注意,instagram包有一个final private function __construct() ,这意味着你不能在原来的类之外使用该包,而不必将构造方法改为public。 我不是说这是一个很好的做法,我build议在instagram包的情况下使用场景2。

无论如何,在这之后,你可以使用这样的包:

 $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! 

添加"tvr/googlecheckout": "dev-master"到你的composer.json

运行composer install ,然后你可以使用IoC容器。 一些代码示例可以在Laravel 4的官方文档中find: http ://four.laravel.com/docs/ioc#basic-usage