Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 4:从数据库中的字符串动态加载类_Php_Class_Dynamic_Laravel_Laravel 4 - Fatal编程技术网

Php Laravel 4:从数据库中的字符串动态加载类

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

我希望我知道如何更恰当地搜索这个问题。这妨碍了我寻找先前的问题;如果这是复制品,请容忍我

请参阅本文底部的更新/编辑内容

背景/我想做的事:

我有一个类似以下内容的URL:

 +-----+-------------------+
 | _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
列中的每个文件都有一个公共接口/一组公共方法

示例:

将转到数据库,从set
23
中获取数据,然后在
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
。啊,安东尼奥,我现在明白了。我的类显示在自动加载文件中,但仅按名称空间显示。我更新了我原来的帖子来反映这一点。我可以通过引用类的完整名称空间来加载该类,因此我可能只会将其存储在数据库中。我认为您有两个选择:添加名称空间“谢谢”;这让我走上了正确的方向。我原来的问题已经更新,以反映我现在的困境。