electrolinux / silex-capsule
Silex 2 的 Laravel Eloquent ORM/Capsule 服务提供程序
Requires
- php: >=5.5.9
- illuminate/database: ~5.0
- illuminate/events: ~5.0
- pimple/pimple: ~3.0
- silex/silex: ~2.0
README
这是一个为 Silex 微型框架 提供的服务提供程序,它通过 Laravel 的 Eloquent ORM 和 Capsule(它独立封装的实现)进行集成。
需求
为了使用服务提供程序,您需要运行 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 作为测试使用的简单内存数据库。
如果您提交一个拉取请求,请确保添加相应的测试。