singular/胶囊

Laravel Eloquent ORM/Capsule 对 Silex 2 的服务提供商

2.0.1 2016-12-03 09:49 UTC

This package is not auto-updated.

Last update: 2024-09-15 02:06:21 UTC


README

此服务提供商是 Silex 微框架的服务提供商,它通过 Capsule 集成 Laravel 的 Eloquent ORM,是一个包装器实现。

要求

要使用此服务提供商,您需要使用 PHP 5.4+

安装

要安装服务提供商,请使用 Composer

composer require electrolinux/silex-capsule:2.*

或者,您可以直接在 composer.json 文件中添加它

{
    "require": {
        "singularphp/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 作为使用 Application::EARLY_EVENT 的 Silex before 中间件注册,因此只有在您的应用程序执行时才可用,在所有事情发生之前。

如果您需要 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, [
    // Multiplas conexões
    'capsule.connections' => [
        'default' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'dname1',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'logging'   => false, // Desabilita o log para esta conexão
        ],

        'other' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'dbname2',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'logging'   => true,  // Habilita o log para esta conexão
        ],
    ],

    /*
    // Conexão única
    'capsule.connection' => [
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'dbname',
        'username'  => 'root',
        'password'  => '',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'logging'   => true, // Habilita o log para esta conexão
    ],
    */

    /*
    // Outras opções
    'capsule.global'   => true, // Habilita o acesso global ao query builder do Capsule.
    'capsule.eloquent' => true, // Automaticamente inicializa o Eloquent ORM.
    */
]);

测试

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

如果您发起 pull request,请确保添加了相关的测试。