[原创] Yaf 使用 Eloquent ORM 做数据层
Yaf 默认是不提供数据层处理功能的, 需要自行扩展.
Eloquent ORM 是 Laravel 的内置 ORM 功能非常强大, 而且已经独立成组建, 任何项目都可以选择使用它.
目前最新版是5.0.28, 主要版本是跟随 Laravel 更新的, 下一个版本是 5.1 LTS 版, 非常棒.
在进行集成前, 需要开启 Yaf 的 namespace, 确保 php.ini
有如下配置:
yaf.use_namespace=1
为了方便管理, 建议使用 Composer 管理扩展, 以下示例均使用 Composer.
安装 Eloquent ORM, 在项目根目录创建 composer.json
, 内容如下:
{
"require": {
"illuminate/database": "5.0.*",
"illuminate/events": "5.0.*",
"symfony/debug": "2.6.*",
"symfony/var-dumper": "2.6.*"
}
}
然后运行 composer update
下载代码, 并在 index.php
引入 vendor
目录下的 autoload.php
速度不理想可尝试我共享的镜像 http://composer.fengqi.me.
<?php
// 程序启动时间
define('APP_START_TIME', microtime(true));
// 程序跟目录
define('ROOT_PATH', realpath(__DIR__.'/../'));
// 加载 Composer
require ROOT_PATH.'/vendor/autoload.php';
// 启动程序
$app = new Yaf\Application(ROOT_PATH."/config/application.ini");
$app->bootstrap()->run();
配置数据库信息, application.ini
增加以下内容:
; database
database.driver = mysql
database.host = 127.0.0.1
database.database = yaf
database.username = root
database.password = 123456
database.port = 3306
database.charset = utf8
database.collation = utf8_unicode_ci
database.prefix = ""
这里使用 MySQL 作为示例, Eloquent 支持 MySQL, Postgres, SQL Server, SQLite.
初始化 Eloquent ORM
确保应用启动应用方式为 $app->bootstrap()->run()
, 关键是 bootstrap()
部分.
application 目录下添加 Bootstrap.php
文件, 内容如下:
<?php
use Yaf\Registry;
use Yaf\Dispatcher;
use Yaf\Application;
use Yaf\Bootstrap_Abstract;
use Illuminate\Events\Dispatcher as LDispatcher;
use Illuminate\Container\Container as LContainer;
use Illuminate\Database\Capsule\Manager as Capsule;
class Bootstrap extends Bootstrap_Abstract
{
public $config;
// 初始化配置
public function _initConfig(Dispatcher $dispatcher)
{
$this->config = Application::app()->getConfig();
Registry::set('config', $this->config);
}
// 初始化 Eloquent ORM
public function _initDefaultDbAdapter(Dispatcher $dispatcher)
{
$capsule = new Capsule();
$capsule->addConnection($this->config->database->toArray());
$capsule->setEventDispatcher(new LDispatcher(new LContainer));
$capsule->setAsGlobal();
$capsule->bootEloquent();
}
}
建立 model
application 下新建 models
目录, 为了便于控制, 我们新增两个文件:
基类 EloquentModel.php
便于以后统一控制一些东西
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class EloquentModel extends Model
{
// todo
}
示例 model, User.php
<?php namespace App\Models;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends EloquentModel
{
// 软删除
use SoftDeletes;
// 表名
public $table = 'user';
// 此字段自动转换成 Carbon 实例
protected $dates = ['deleted_at'];
// 允许批量赋值的字段
protected $fillable = ['name', 'password', 'email'];
}
设置 model 自动加载
在 composer.json
添加 psr-4
, 最终内容如下:
{
"require": {
"illuminate/database": "5.0.*",
"illuminate/events": "5.0.*",
"symfony/debug": "2.6.*",
"symfony/var-dumper": "2.6.*"
},
"autoload": {
"App\\Models\\": "application/models"
}
}
执行 composer dump-autoload
解析 psr-4.
测试
配置好喜欢的路由, 新建一个 user
表, 尝试调用 User 插入和获取数据
<?php
use App\Models\User;
use Yaf\Controller_Abstract;
class IndexController extends Controller_Abstract
{
public function indexAction()
{
// 插入, 方式之一
User::create([
'name' => 'eloquent',
'password' => password_hash('password', PASSWORD_BCRYPT, ['cost' => 12]),
'email' => 'test@example.com'
]);
// 获取
$user = User::find(1);
dd($user->toArray()); // dd 放到
}
}
其它使用方式参考官方文档, 或国内爱好者翻译的中文 Eloquent ORM. 如果可能建议直接使用 Laravel.
另外这里暂时不演示 Eloquent ORM 另外一个强大的组建 Scheme
的使用. 也没有考虑到 module, 有需要可自行变通.
这是php什么版本的啊?
我也报错
Warning: Yaf\Loader::autoload(): Failed opening script D:\php\PHPTutorial\WWW/application\library\application\Models\User.php: No such file or directory in D:\php\PHPTutorial\WWW\application\controllers\Index.php on line 21
执行了 composer dump-autoload也不行,还是报错我的7.0.12
最好还加上 "illuminate/database": "5.0.*", 不然在使用 Eloquent ORM 分页的时候会报错!
引入 ORM性能骤降..... 丧失了yaf的本意。不知道是不是我引入的文件过多,感觉和其他php轻框架没啥区别
性能损失是必然的, 其实没必要太在意框架层面的性能, 更多的还是考虑适用性, 性能有太多方式优化了, 当然我本人还是更倾向于用Medoo这类简单的数据库访问类
yaf.use_spl_autoload = 1
这个配置还没有配 所以才会出现 楼上的错误
Yaf\Loader::autoload(): Failed opening script E:\wwwroot\yafcms/core/\Illuminate\Events\Dispatcher.php: No such file or directory in E:\wwwroot\yafcms\app\Bootstrap.php on line 20
新版本没有这个文件~
ORM自带事务处理功能吗?好像不能用啊
要再加一个"illuminate/events": "*"包
"illuminate/events": "5.0.*",这个包已经加上了
但是还是报错
Warning: Yaf\Loader::autoload(): Failed opening script E:\yaf/application/\library\User.php: No such file or directory in E:\yaf\application\controllers\index.php on line 6
Fatal error: Class 'User' not found in E:\yaf\application\controllers\index.php on line 6
先确认文件存在, 然后试着执行下 composer dump-autoload
贴代码吧, 可以放 github, 或者看下 vendor/composer/autoload_psr4.php 里面的路径对不对.
博主你好,我确认了,也执行composer了,可是还是报一样的错误,想能指点下吗?qq:782319392谢谢了
为什么我按你的来弄,提示
Warning: Yaf_Loader::autoload(): Failed opening script /alidata/www/htdocs/apps/library/User.php: No such file or directory in /alidata/www/htdocs/apps/controllers/Index.php on line 6
Fatal error: Class 'User' not found in /alidata/www/htdocs/apps/controllers/Index.php on line 6
我也是这样错误!
先确认文件存在, 然后试着执行下 composer dump-autoload
哪里来的 library/User.php
错误提示不是告诉你了,文件不存在:
/alidata/www/htdocs/apps/library/User.php: No such file or directory in /alidata/www/htdocs/apps/controllers/Index.php on line 6