2015-11-04 53 views
4

我使用Slim FrameworkLaravel's Eloquent ORM在一起,这是我的代码:修身框架和雄辩的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文件。但是如果我有多个模型呢?我可以只包含一个文件夹,并且所有模型也将包含在内,这样它就不会显得杂乱无章,包括索引中的每个模型文件。

预先感谢您。

UPDATE: 我使用这段代码,我看到

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

是否有一个更清洁的方式看?

+2

添加您的模型文件夹到磁带自动加载(作曲家),并把他们都在干净的代码命名空间:) –

回答

8

您可以使用Composer来自动包含在你的项目的类。比方说,你composer.json文件生命app。然后你就可以在models使用classmap属性,为composer.json自动包括所有类:

... 
"require": { 
    "php" : ">=5.4.0", 
    "slim/slim" : "2.*", 
    "illuminate/database" : "5.0.33", 
    ... 
}, 
"autoload": { 
    "classmap" : [ 
     "models" 
    ] 
} 

classmap告诉作曲家的所有类在指定的目录(IES)映射。然后,所有你需要做的就是运行composer update更新作曲家的名单包括只要添加一个新的文件到这个目录。

0

,有做到这一点,即自动加载一个更清洁的方式。

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

的原理是模仿与文件层次的命名空间,并相应地加载这些命名空间:

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

这将自动包含该文件位于应用程序/模型/ user.php的。尊重名字空间中的大写内容是一种很好的做法。如果你的命名空间是型号\用户,目录应该尊重外壳(应用/型号/ user.php的)


与您当前的解决方案的问题:

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

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