5

我希望我知道如何更恰当地搜索这个问题/短语。这妨碍了我寻找先前的问题;如果这是重复的,请耐心等待。

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

背景/我正在尝试做的事情:

我有一个看起来很像这样的 URL:

http://myapp.com/calculate//$fileID _$calculateID

$fileID并且$calculateID是我用来跟踪数据集的键,我称之为“计算”。本质上,该 URL 表示$calculateID$fileID.

我去我的数据库(mongo)并询问一个 php 类名或 sring 或文件路径,或者你有什么匹配$calculateID的。例如,假设表格如下所示:

 +-----+-------------------+
 | _id |     phpFile       |
 +-----+-------------------+
 |   1 | basicCalcs.php    |
 |   2 | advancedCalcs.php |
 |   3 | summaryCalcs.php  |
 +-----+-------------------+

注意:可以安全地假设phpFile列中的每个文件都有一个公共接口/一组公共方法。

例子:

http://myapp.com/calculate/23/2

会去数据库,从 set 中获取数据23,然后在advancedCalcs.php. advancedCalcs.php加载后,其中的一个函数将接收数据。从那里,对数据执行一组计算和转换。

我的问题

我的问题是什么是“laravel 4 友好”方式来动态加载advancedCalcs.php数据并将数据输入一组方法?有没有办法延迟加载这种类型的东西。目前,我只知道非常简单的require_once()方法。我真的很想避免这种情况,因为我确信 laravel 4 具有动态加载底层类并将其连接到公共接口的功能。

编辑 1

多亏了 Antonio Carlos Ribeiro,我才能取得一些进展。

运行 dump-autoload 命令后,我的vendor/composer/autoload_classmap.php文件有几个新条目,如下所示:

'AnalyzeController' => $baseDir . '/app/controllers/AnalyzeController.php',
'AppName\\Calc\\CalcInterface' => $baseDir . '/app/calculators/CalcInterface.php',
'AppName\\Calc\\basicCalcs' => $baseDir . '/app/calculators/basicCalcs.php',

使用如下示例的代码,我可以创建 basicCalcs 类的实例:

$className = "AppName\\Calc\\basicCalcs";

$instance = new $className; 

var_dump($instance);

文件basicCalcs.php如下所示:

//PATH: /app/calculators/basicCalcs.php
<?php namespace Reporter\Calc;


class basicCalcs {


    public function sayHi(){
        echo("hello world! i am basicCalcs");
    }

};

?>

更新的问题: 我怎样才能创建一个类似于AnalyzeController条目 的别名,autoload_classmap.php而不必basicCalcs.php使用完整的命名空间来引用?

4

2 回答 2

6

将您的库文件夹添加到您的 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"
    ]
},

更新您的自动加载的类:

composer dump-autoload

如果您想确保它确实有效,请检查您的类是否自动加载打开文件

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 );
    }

}

我假设你的计算器都是:

class basicCalcs {

    public function calculate($calculateID)
    {
        return performCalculation( $calculateID ); /// something like this
    }

}

你的路由器有点像

Route::get('/calculate/{fileID}/{calculateID}', array('as'=>'calculate', 'uses'=>'CalculateController@calculate'));
于 2013-06-24T00:15:28.050 回答
1

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部分。例如,将用于从文件夹加载所有类,并将自动从文件夹加载类。因此,将您的库文件夹添加到该部分。在部分中添加文件夹路径后,您必须运行classmaplaravel4"app/controllers",app/controllers"app/tests/TestCase.php"Laravel4TestCase.phpapp/tests/classmapautoload -> classmap

composer dumpautoload // or
composer dump-autoload

从命令行。

于 2013-06-24T00:15:43.557 回答