Bundles

目录

基础介绍

Bundles是自Laravel3.0后增加的核心功能. 提供一种简单的方法, 把一组功能代码方便的集成到"bundles"中. 一个bundle可以有它自己的视图, 配置文件, 路由, 数据迁移, 任务, 以及更多其他的组件. 一个bundle可以是任意类型的扩展如数据库的ORM或一个强大的验证系统. bundle的模块化是一个重要的机制, 是Laravel设计架构的内在驱动. 你其实可以把application文件夹下的程序想象成一个特殊的bundle, 只不过它是优先被加载和使用的.

创建Bundles

创建一个bundle的第一步是在bundles目录下创建一个你的bundle的文件夹. 下面的例子中, 我们创建一个"admin"bundle, 用来容纳管理员后端数据. application/start.php文件提供了一些用于定义程序运行方式的属性. 同样的我们也需要在bundle文件夹下创建一个名为start.php文件, 它和application文件夹下的start.php文件属性意义是相同的. 每次bundle被加载的时候start.php文件会执行, 让我们来创建一个:

创建一个bundle的start.php文件:

<?php

Autoloader::namespaces(array(
    'Admin' => Bundle::path('admin').'models',
));

在start文件中, 我们指明名为"Admin"的命名空间的类要从bundle的models文件夹下装载. 你可以让你的start文件做任何事情, 通常的它只用来注册类的自动加载. **事实上, 在一个bundle中创建start文件并不是必须的. **

现在, 我们要看一下怎么将这个bundle注册到整个程序中!

注册Bundles

现在, 我们已经有了admin bundle, 我们需要把它注册到Laravel. 打开application/bundles.php文件. 这是注册所有bundles到真个工程中的地方. 让我们加入admin bundle:

注册一个简单的bundle:

return array('admin'),

简单起见, Laravel默认认为Admin bundle的位置在bundle文件夹的根处. 但是如果你愿意也可以指定到其他的文件夹

注册一个bundle到自定义的位置:

return array(

    'admin' => array('location' => 'userscape/admin'),

);

现在Laravel会在bundles/userscape/admin目录查找Admin bundle.

Bundles类加载

通常的, 一个bundle的start.php文件只用来注册类加载的方式. 所以你完全可以不要start.php文件而是直接在bundle注册的时候指定加载方式:

在bundle注册中指明自动加载映射:

return array(

    'admin' => array(
        'autoloads' => array(
            'map' => array(
                'Admin' => '(:bundle)/admin.php',
            ),
            'namespaces' => array(
                'Admin' => '(:bundle)/lib',
            ),
            'directories' => array(
                '(:bundle)/models',
            ),
        ),
    ),

);

注意, 每一个键对应于Laravel自动加载的函数. 事实上, 每一个键对应的每一个值会在自动加载时自动传入函数中.

你也注意到了(:bundle)占位符. 为了方便, 它会被自动的替换成bundle目录. 这是一个简便的方式.

启动Bundles

虽然我们创建并注册了一个bundle, 但我们还不能使用它. 首先, 我们需要启动它:

启动一个Bundles:

Bundle::start('admin');

这句话是告诉Laravel执行定义bundle类加载的start.php文件(没有的话会从注册配置中找到).如果存在的话start方法还会加载bundle的routes.php文件.

提示: 一个bundle只会被启动一次. 多次调用的start方法将会被忽略.

如果你想在整个应用中使用bundle, 你也许想在每次请求时都启动他. 这种情况下你可以在application/bundles.php文件中增加bundle自动启动属性:

把一个bundle设置成自动启动的:

return array(

    'admin' => array('auto' => true),

);

你不需要总是显示的指明启动bundle. 事实上, 你可以像bundle已经启动那样正常的编写代码, 如果没启动的话Laravel会自动帮你完成的. 例如如果你调用一个bundle的视图, 配置文件, 语言, 路由或者过滤器bundle会自动启动.

bundle的每次启动都会激活一个事件, 你可以像这样监听这个事件:

监听一个bundle的启动:

Event::listen('laravel.started: admin', function()
{
    // The "admin" bundle has started...
});

也可以让一个bundle变得"不可用(disable)", 那样它将永远不会被启动.

让一个bundle变得不可用, 它将永远不会被启动:

Bundle::disable('admin');

Bundles路由

请参阅Bundles路由bundle控制器学习相关Bundles路由的知识.

使用Bundles

如前所述, bundles可以有视图, 配置文件, 路由, 数据迁移, 语言, 任务, 以及更多其他的组件. laravel中使用双冒号语法来加载这些项目. 让我们看一些例子:

加载一个bundle视图:

return View::make('bundle::view');

加载一个bundle的配置项:

return Config::get('bundle::file.option');

加载一个bundle的语言项:

return Lang::line('bundle::file.line');

有时你可能需要获得更多bundle的"基本(meta)"信息, 比如它是否存在, 它放置的位置, 或者其整个配置项数组. 下面是方法:

确定一个bundle是否存在:

Bundle::exists('admin');

获得bundle的安装位置:

$location = Bundle::path('admin');

获得bundle的整个配置项数组:

$config = Bundle::get('admin');

获得所有已安装bundle的名称:

$names = Bundle::names();

Bundle资源(Assets)

如果你的bundle中包含视图, 很可能你要有资源文件(assets), 如JavaScript和图片, 这些需要存放在程序的public目录. 这没问题, 在你的bundle目录下建立public文件夹, 并将所有资源放置在此文件夹中.

太棒了!但是, 他们怎么被放到用工程的**public*文件夹下呢. Laravel的"Artisan"命令行提供了一个简单的命令, 可以把所有资源拷贝到public目录:

把所有资源拷贝到public目录:

php artisan bundle:publish

此命令将在public/bundles目录下创建一个存放bundle资源的文件夹. 例如, 如果你的bundle叫做"admin", public/bundles/admin文件夹将被创建, 它将包含所有在你的bundle的public文件夹的下的文件.

资源被放入public文件夹后, 想要方便地获取资源, 请参阅资源(asset)管理文档.

安装Bundles

当然, 你总是可以手动安装bundles, "Artisan"的命令行工具(CLI)提供了很棒的安装和升级你的bundle的方法. Laravel框架使用简单的ZIP提取来安装bundle. 这么做:

通过"Artisan"的命令行工具安装一个bundle:

php artisan bundle:install eloquent

很好! 现在bundle已经被安装了, 可以阅读注册bundle发布bundle资源进行bundle的进一步使用.

需要一个已存在的bundles列表吗? 去Laravel网站上看一看吧 bundle目录

升级 Bundles

当你升级 bundle时, Laravel会自动删除旧的增加新的.

通过"Artisan"的命令行工具升级一个bundle:

php artisan bundle:upgrade eloquent

提示: bundle之后, 升级之后你要重新发布bundle资源.

重要提示: 因为在升级的过程中bundle被完全的删除了, 在升级bundle之前你必须清楚升级带来的变化. 也许你需要改变一下bundle的配置选项.要通过bundle的启动事件做更改而不是直接改bundle的代码. 一般建议在application/start.php文件中做处理.

监听bundle的启动事件:

Event::listen('laravel.started: admin', function()
{
    Config::set('admin::file.option', true);
});