Php Laravel 4:从数据库中的字符串动态加载类
我希望我知道如何更恰当地搜索这个问题。这妨碍了我寻找先前的问题;如果这是复制品,请容忍我 请参阅本文底部的更新/编辑内容 背景/我想做的事: 我有一个类似以下内容的URL:Php Laravel 4:从数据库中的字符串动态加载类,php,class,dynamic,laravel,laravel-4,Php,Class,Dynamic,Laravel,Laravel 4,我希望我知道如何更恰当地搜索这个问题。这妨碍了我寻找先前的问题;如果这是复制品,请容忍我 请参阅本文底部的更新/编辑内容 背景/我想做的事: 我有一个类似以下内容的URL: +-----+-------------------+ | _id | phpFile | +-----+-------------------+ | 1 | basicCalcs.php | | 2 | advancedCalcs.php | | 3 | summaryCa
+-----+-------------------+
| _id | phpFile |
+-----+-------------------+
| 1 | basicCalcs.php |
| 2 | advancedCalcs.php |
| 3 | summaryCalcs.php |
+-----+-------------------+
'AnalyzeController' => $baseDir . '/app/controllers/AnalyzeController.php',
'AppName\\Calc\\CalcInterface' => $baseDir . '/app/calculators/CalcInterface.php',
'AppName\\Calc\\basicCalcs' => $baseDir . '/app/calculators/basicCalcs.php',
//PATH: /app/calculators/basicCalcs.php
<?php namespace Reporter\Calc;
class basicCalcs {
public function sayHi(){
echo("hello world! i am basicCalcs");
}
};
?>
$fileID
/$calculateID
$fileID
和$calculateID
是我用来跟踪数据集的键,我称之为“计算”。实际上,该URL表示对$fileID
中的数据执行$calculateID
我转到我的数据库(mongo)并询问php类名、sring或文件路径,或者您拥有的与$calculateID
匹配的内容。例如,让我们假设该表如下所示:
+-----+-------------------+
| _id | phpFile |
+-----+-------------------+
| 1 | basicCalcs.php |
| 2 | advancedCalcs.php |
| 3 | summaryCalcs.php |
+-----+-------------------+
'AnalyzeController' => $baseDir . '/app/controllers/AnalyzeController.php',
'AppName\\Calc\\CalcInterface' => $baseDir . '/app/calculators/CalcInterface.php',
'AppName\\Calc\\basicCalcs' => $baseDir . '/app/calculators/basicCalcs.php',
//PATH: /app/calculators/basicCalcs.php
<?php namespace Reporter\Calc;
class basicCalcs {
public function sayHi(){
echo("hello world! i am basicCalcs");
}
};
?>
注意:可以安全地假设phpFile
列中的每个文件都有一个公共接口/一组公共方法
示例:
将转到数据库,从set23
中获取数据,然后在advancedcals.php
中加载函数。加载advancedCalcs.php
后,中的函数将接收数据。在此基础上,对数据执行一组计算和转换
我的问题
我的问题是,动态加载advancedcals.php
并将数据输入一组方法的“Laravel4友好”方式是什么?有没有一种方法可以延迟加载这种类型的东西。目前,我只知道非常简单的require\u once()
方法。我确实希望避免这种情况,因为我确信Laravel4具有动态加载底层类并将其连接到公共接口的功能
编辑1
多亏了安东尼奥·卡洛斯·里贝罗,我才取得了一些进步
运行dump autoload命令后,我的vendor/composer/autoload_classmap.php
文件中有几个新条目,如下所示:
+-----+-------------------+
| _id | phpFile |
+-----+-------------------+
| 1 | basicCalcs.php |
| 2 | advancedCalcs.php |
| 3 | summaryCalcs.php |
+-----+-------------------+
'AnalyzeController' => $baseDir . '/app/controllers/AnalyzeController.php',
'AppName\\Calc\\CalcInterface' => $baseDir . '/app/calculators/CalcInterface.php',
'AppName\\Calc\\basicCalcs' => $baseDir . '/app/calculators/basicCalcs.php',
//PATH: /app/calculators/basicCalcs.php
<?php namespace Reporter\Calc;
class basicCalcs {
public function sayHi(){
echo("hello world! i am basicCalcs");
}
};
?>
使用下面的示例代码,我可以创建basicCalcs类的实例:
$className = "AppName\\Calc\\basicCalcs";
$instance = new $className;
var_dump($instance);
其中basicCalcs.php
文件如下所示:
+-----+-------------------+
| _id | phpFile |
+-----+-------------------+
| 1 | basicCalcs.php |
| 2 | advancedCalcs.php |
| 3 | summaryCalcs.php |
+-----+-------------------+
'AnalyzeController' => $baseDir . '/app/controllers/AnalyzeController.php',
'AppName\\Calc\\CalcInterface' => $baseDir . '/app/calculators/CalcInterface.php',
'AppName\\Calc\\basicCalcs' => $baseDir . '/app/calculators/basicCalcs.php',
//PATH: /app/calculators/basicCalcs.php
<?php namespace Reporter\Calc;
class basicCalcs {
public function sayHi(){
echo("hello world! i am basicCalcs");
}
};
?>
//路径:/app/calculators/basicCalcs.php
更新问题:
如何创建类似于
autoload_classmap.php
中的AnalyzeController
条目的别名,而不必使用完整的命名空间引用basicCalcs.php
?将库文件夹添加到composer.json自动加载:
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/extended",
"app/calculators", <------- This is where you put all your calculators
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
]
},
如果您想确保它确实起作用,请检查您的类是否在打开文件时自动加载
vendor/composer/autoload_classmap.php
为了直观地实例化它们,最好将其作为表类名:
+-----+-------------------+-------------------+
| _id | phpFile | namespace |
+-----+-------------------+-------------------+
| 1 | basicCalcs | Reporter\Calc\ |
| 2 | advancedCalcs | Reporter\Calc\ |
| 3 | summaryCalcs | Reporter\Calc\ |
+-----+-------------------+-------------------+
那你只需要使用它
class CalculateController extends Controller {
public function calculate($fileID, $calculateID)
{
$file = phpFile::find($fileID);
$className = $file->namespace . $file->phpFile;
$calculator = new $className; //// <--- this thing will be autoloaded
return $calculator->calculate( $calculateID );
}
}
你的路由器就像是
Route::get('/calculate/{fileID}/{calculateID}', array('as'=>'calculate', 'uses'=>'CalculateController@calculate'));
在
Laravel4
中,文件composer.json
对此负责,下面是一个示例
{
"require": {
"laravel/framework": "4.0.*"
},
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
]
},
"scripts": {
"post-update-cmd": "php artisan optimize"
},
"config": {
"preferred-install": "dist"
},
"minimum-stability": "dev"
}
请注意autoload
部分,其中classmap
用于告诉laravel4
应该从哪些文件夹加载类以及应该加载哪些文件。例如,“app/controllers”、
将用于从app/controllers
文件夹加载所有类,“app/tests/TestCase.php”
将使Laravel4
自动从app/tests//code>文件夹加载类TestCase.php
。因此,将您的库文件夹添加到classmap
部分。在autoload->classmap
部分添加文件夹路径后,必须运行
composer dumpautoload // or
composer dump-autoload
从命令行。谢谢。我知道您想做什么,但是find()方法不存在于laravel 4的文件系统类中。在php.net上,我似乎也没怎么提到它。通过执行以下操作,我能够获得所需的内容:$className=“The\\Namespace\\path\\inutoLoad\u classmap.php”$instance=new$className代码>这可以工作,但是我有没有办法为名称空间设置别名?很抱歉,该文件:,为了更清楚,我将其更改为phpFile,因为它应该是存储文件名的phpFile模型。只要你的类出现在autoload_classmap.php文件中,你就不需要名称空间,当然,除非你需要它们来组织你的代码。namespace
是必需的,如果你想使用psr0
。啊,安东尼奥,我现在明白了。我的类显示在自动加载文件中,但仅按名称空间显示。我更新了我原来的帖子来反映这一点。我可以通过引用类的完整名称空间来加载该类,因此我可能只会将其存储在数据库中。我认为您有两个选择:添加名称空间“谢谢”;这让我走上了正确的方向。我原来的问题已经更新,以反映我现在的困境。