electrolinux/silex-capsule

Silex 2 的 Laravel Eloquent ORM/Capsule 服务提供程序

2.0.1 2016-12-03 09:49 UTC

This package is auto-updated.

Last update: 2024-09-24 04:49:26 UTC


README

这是一个为 Silex 微型框架 提供的服务提供程序,它通过 Laravel 的 Eloquent ORMCapsule(它独立封装的实现)进行集成。

需求

为了使用服务提供程序,您需要运行 PHP 5.4+

安装

安装服务提供程序的最佳方式是使用 Composer

composer require electrolinux/silex-capsule:2.*

或者,您可以直接将其添加到您的 composer.json 文件中

{
    "require": {
        "electrolinux/silex-capsule": "2.*"
    }
}

基本用法

要在您的应用程序中使用它,只需将服务提供程序与 Silex 注册即可

<?php        
$app = new Silex\Application;

$app->register(new Electrolinux\Silex\Provider\CapsuleServiceProvider, [
    'capsule.connection' => [
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'database',
        'username'  => 'username',
        'password'  => 'password',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'logging'   => true,
    ],
]);

有关可用选项的更多信息,您应参考 Capsule 文档

注册服务提供程序后,将在调用任何路由控制器之前创建一个 Capsule 对象并启动 Eloquent。如果您对技术方面感兴趣,Capsule 被作为 Silex 的 before 中间件注册,使用 Application::EARLY_EVENT,因此它只会在您的应用程序运行并在此之前提供。

如果您需要在应用程序运行之前启动 Capsule 和 Eloquent(例如在 Symfony 控制台命令中),您只需在依赖注入容器中访问其数组元素即可

$app['capsule']; 

Capsule 默认可供全局使用,允许您直接在控制器中编写查询

use Illuminate\Database\Capsule\Manager as Capsule;

$app->get('/book/{id}', function(Application $app, $id) {
    $book = Capsule::table('books')->where('id', $id)->get();
    return $app->json($book);
});

如果您不想启动 Capsule,则将 capsule.global 设置为 false。如果您不打算使用 Eloquent 来构建模型,也可以通过将 capsule.eloquent 设置为 false 来防止其启动。

创建 Eloquent 模型的方式与在 Laravel 中创建它们的方式相同

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    protected $table = 'books';

    protected $fillable = [
        'title', 
        'author',
    ];

    protected $casts = [
        'title'  => 'string',
        'author' => 'string',
    ];

    // The rest of your model code...
}

然后您可以在控制器中使用它及其所有功能,就像在 Laravel 中使用一样

$app->get('/books', function(Application $app) {
    $books = Book::with('tags')->all();
    return $app->json($books);
});

$app->post('/book', function(Application $app, Request $request) {
    $book         = new Book();
    $book->title  = $request->request->get('title');
    $book->author = $request->request->get('author');
    $book->save();
});

高级用法

您可以使用服务提供程序设置多个连接,甚至缓存;只需使用 capsule.connections 选项即可

<?php
$app = new Silex\Application;

$app->register(new Electrolinux\Silex\Provider\CapsuleServiceProvider, [
    // Connections
    'capsule.connections' => [
        'default' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'dname1',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'logging'   => false,
        ],

        'other' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'dbname2',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'logging'   => true,
        ],
    ],
]);

如果您已在连接上启用了查询日志,您可以通过 Capsule 获取它

Capsule::connection($name)->getQueryLog();

您可以使用连接凭据中的 logging 选项按连接切换查询日志

您还可以使用 Eloquent 的架构构建工具来构建迁移

$app['capsule']->schema()->create('books', function($table) {
    $table->increments('id');
    $table->string('title');
    $table->string('author');
    $table->timestamps();
});

默认情况下,服务提供程序安装了 Laravel Events 包,因此您还可以使用模型观察者

<?php
class BookObserver 
{
    public function saving($model)
    {
        // Do something
    }
}

Book:observe(new BookObserver());

Capsule 选项示例

以下是一个完整示例,显示了您可以传递给服务提供程序的所有可用选项

<?php
$app = new Silex\Application;

$app->register(new Electrolinux\Silex\Provider\CapsuleServiceProvider, [
    // Multiple Connections
    'capsule.connections' => [
        'default' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'dname1',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'logging'   => false, // Toggle query logging on this connection.
        ],

        'other' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'dbname2',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'logging'   => true,  // Toggle query logging on this connection.
        ],
    ],

    /*
    // Single Connection
    'capsule.connection' => [
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'dbname',
        'username'  => 'root',
        'password'  => '',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'logging'   => true, // Toggle query logging on this connection.
    ],
    */

    /*
    // Other Options
    'capsule.global'   => true, // Enable global access to Capsule query builder.
    'capsule.eloquent' => true, // Automatically boot Eloquent ORM.
    */
]);

测试

有一些基本测试以确保 Capsule 对象正确地与 Silex 注册。您可以使用 PHPUnit 运行它们,并且您还需要 SQLite 作为测试使用的简单内存数据库。

如果您提交一个拉取请求,请确保添加相应的测试。