【问题标题】:Slim Framework and Eloquent ORMSlim 框架和 Eloquent ORM
【发布时间】:2016-02-04 09:44:15
【问题描述】:

我将Slim FrameworkLaravel's Eloquent ORM 一起使用,这是我的代码:

User.php

class User extends \Illuminate\Database\Eloquent\Model
{
    protected $table = 'accounts';
}

index.php

require_once 'vendor/autoload.php';

// Models
include 'app/models/User.php';

$app = new \Slim\Slim();

// 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 Illuminate\Container\Container;
$connFactory = new \Illuminate\Database\Connectors\ConnectionFactory($container);
$conn = $connFactory->make($settings);
$resolver = new \Illuminate\Database\ConnectionResolver();
$resolver->addConnection('default', $conn);
$resolver->setDefaultConnection('default');
\Illuminate\Database\Eloquent\Model::setConnectionResolver($resolver);

$app->get('/', function () use ($app) {
    $users = \User::all();
    echo $users->toJson();
});

$app->run();

正如您在我的代码中看到的,我必须将User.php 文件包含在我的index.php 中。但是,如果我有多个模型怎么办?我可以只包含一个文件夹,并且所有模型也将包含在内,这样它就不会显得凌乱,包括我索引中的每个模型文件。

提前谢谢你。

更新: 我正在使用我看到的这段代码

foreach (glob("app/models/*.php") as $filename)
{
    include $filename;
}

有没有更干净的方式?

【问题讨论】:

  • 将你的模型文件夹添加到自动加载器(composer)中,并将它们全部放在一个干净的代码的命名空间中:)

标签: php laravel eloquent composer-php slim


【解决方案1】:

是的,有一种更简洁的方法可以做到这一点,即自动加载。

归结为使用spl_autoload_register() 和自定义类加载器。

原理是用文件层次来模仿命名空间,并相应地将它们加载到命名空间中:

$loader = function load($class)
{
    include __DIR__."/app/$class.php";
}
spl_autoload_register($loader);
$user = new models\User();

这将自动包含位于 app/models/User.php 的文件。在命名空间中尊重大写字母是一个好习惯;如果您的命名空间是 Model\User,则目录应该尊重大小写 (app/Model/User.php)


您当前解决方案的问题:

foreach (glob("app/models/*.php") as $filename)
{
    include $filename;
}

是它会加载所有类,即使脚本不会使用它们。注册一个自动加载器可以防止这种情况,只加载必要的代码。

【讨论】:

    【解决方案2】:

    您可以使用 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 的包含列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      相关资源
      最近更新 更多