我将Slim Framework
和Laravel's Eloquent ORM
一起使用,这是我的代码:
User.php
class User extends IlluminateDatabaseEloquentModel
{
protected $table = 'accounts';
}
index.php
require_once 'vendor/autoload.php';
// Models
include 'app/models/User.php';
$app = new SlimSlim();
// Database information
$settings = array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'photo_mgmt',
'username' => 'root',
'password' => '',
'collation' => 'utf8_general_ci',
'prefix' => '',
'charset' => 'utf8',
);
$container = new IlluminateContainerContainer;
$connFactory = new IlluminateDatabaseConnectorsConnectionFactory($container);
$conn = $connFactory->make($settings);
$resolver = new IlluminateDatabaseConnectionResolver();
$resolver->addConnection('default', $conn);
$resolver->setDefaultConnection('default');
IlluminateDatabaseEloquentModel::setConnectionResolver($resolver);
$app->get('/', function () use ($app) {
$users = User::all();
echo $users->toJson();
});
$app->run();
正如您在我的代码中看到的,我必须在index.php
中包含User.php
文件。但是如果我有多个模型呢?我可以只包括一个文件夹,所有的模型也会包括在内,这样它就不会看起来一团糟,包括我索引中的每个模型文件。
提前谢谢。
更新:我正在使用我看到的的这段代码
foreach (glob("app/models/*.php") as $filename)
{
include $filename;
}
有更干净的路吗?
您可以使用Composer自动包含项目中的类。假设您的composer.json
文件位于app
中。然后,您可以使用composer.json
中的classmap
属性来自动包括models
:中的所有类
...
"require": {
"php" : ">=5.4.0",
"slim/slim" : "2.*",
"illuminate/database" : "5.0.33",
...
},
"autoload": {
"classmap" : [
"models"
]
}
classmap
命令Composer映射指定目录中的所有类。然后,只要向该目录中添加新文件,就需要运行composer update
来更新Composer的includes列表。
是,有一种更干净的方法可以做到这一点,即自动加载。
它可以归结为使用spl_autoload_register()和自定义类加载器。
其原理是用文件层次结构模拟名称空间,并相应地将其加载到名称空间:
$loader = function load($class)
{
include __DIR__."/app/$class.php";
}
spl_autoload_register($loader);
$user = new modelsUser();
这将自动包括位于app/models/User.php的文件。在命名空间中尊重大写字母是一种很好的做法;如果您的命名空间是Model\User,那么目录应该遵循大小写(app/Model/User.php)
您当前解决方案的问题:
foreach (glob("app/models/*.php") as $filename)
{
include $filename;
}
它将加载所有类,即使脚本不会使用它们。注册自动加载器将防止这种情况,只加载必要的代码。