【问题标题】:Implementing custom class in Slim在 Slim 中实现自定义类
【发布时间】:2015-04-28 20:00:32
【问题描述】:

我是第一次尝试 slim,我喜欢微框架的概念。我喜欢我可以管理自己的数据库层而不是依赖于 ORM 的事实,所以休息一下,我被困在苗条的应用程序中添加自己的类。 我浏览了 Slim 文档,并不清楚我应该使用什么来在应用程序中添加我自己的类。 我现在正在使用中间件,这就是我试图实现的方式。

目录结构

索引文件:

<?php

require 'Slim\Slim.php' ;
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();

$app->add(new \models\MyDb());
$app->config(array(
    'templates.path' => 'templates',
));

$app->get('/', function() use ($app){
    $data = $db->testApp();
    $app->render('main.php', $data);
});

$app->run();

?>

我想要实现的数据库包装器:

models/db.php

class MyDb extends ..\Slim\Middleware{
public function testApp(){
    /* Returns something */
 }
}

返回的错误
致命错误:第 6 行的 C:\xampp\htdocs\slimtest\index.php 中找不到类 'models\MyDb'

我知道我犯了一个非常简单的错误,或者我在考虑实现,但请详细解释一下,因为我对 Slim 和 Micro 框架总体来说还很陌生。

我已经解决了有关堆栈溢出的这些问题:
hooks versus middleware in slim 2.0
Routing with AngularJS and Slim PHP

但它们并没有太大帮助,而且我不喜欢采用程序方式并将所有逻辑写入一个文件中。

注意:我已尝试替换斜杠和目录结构,但没有成功。

【问题讨论】:

    标签: php slim


    【解决方案1】:

    我不是 Slim 专家,但您的代码存在多个问题。

    你的文件结构应该是:

    models
     --> MyDb.php
    Slim
     --> original slim files
    templates
     --> main.php
    index.php (main file runnning the app)
    

    如果你想使用 Slim 框架中的 PSR 自动加载器。

    您的MyDb.php 文件应如下所示:

    <?php
    
    namespace models;
    
    class MyDb extends \Slim\Middleware{
        public function testApp(){
            return "this is my sample data";
        }
    
        public function call()
        {
            $this->next->call();
        }
    }
    

    必须实现call() 方法,因为它扩展了\Slim\Middleware

    您的index.php 应如下所示:

    <?php
    
    require 'Slim\Slim.php' ;
    \Slim\Slim::registerAutoloader();
    $app = new \Slim\Slim();
    
    $app->config(array(
            'templates.path' => 'templates',
        ));
    
    $app->get('/', function() use ($app){
            $db = new \models\MyDb();
            $data = $db->testApp();
            $app->render('main.php', array('data' => $data));
        });
    
    $app->run();
    
    ?>
    

    在您之前的代码中,$db 是未定义的变量。

    当您的main.php 文件如下所示时:

    hello world   <?= $data ?>
    

    输出将是:

    你好,这是我的示例数据

    如预期的那样

    【讨论】:

    • 我试图实现这一点,但我又遇到了一个错误,它没有获得类。 致命错误:在第 12 行的 C:\xampp\htdocs\slimtest\index.php 中找不到类“models\MyDb”。我们不是必须在某处使用命名空间吗?
    • @Shashi 您是否使用了与我显示的完全相同的代码?它没有问题。您应该查看文件名(区分大小写)并输入与我在答案中所做的完全相同的代码。
    • 是的,我使用了完全相同的代码,我还仔细检查了文件名,但没有运气。我遇到了同样的错误:致命错误:第 12 行的 C:\xampp\htdocs\slimtest\index.php 中找不到类 'models\MyDb'
    • 经过一些研究,我可以设法消除该错误,但现在它又抛出了另一个错误。 致命错误:在第 5 行的 C:\xampp\htdocs\slimtest\models\db.php 中找不到类“Slim\Middleware”
    • @Shashi 它可以正常工作(我已经再次测试过)。在 Slim 目录中有 Middleware.php 文件,因此自动加载器可以毫无问题地加载它。
    【解决方案2】:

    你选择了一条艰难的人生道路。我可以建议一个仅由 $database->add ('\name\of\your\class') 完成的框架吗?

    看一下该框架的简短展示(称为 db.php)https://github.com/hazardland/db.php/blob/master/samples/001.showcase.php

    http://dbphp.net 是代码优先风格的对象关系映射器,如果您愿意,它甚至可以创建数据库并即时同步所有内容。

    我认为 Slim(不仅是 Slim,还有其他 ORM)做事不是很直观。

    【讨论】:

    • 我明白,但我已经有类似的东西了,虽然肯定不是那么大,但我正在寻找干净的路线和其他一些东西,我相信 Slim 非常适合。我不是在寻找 ORM,如果我没记错的话,你的回答更像是一个建议,而不是一个直接的答案,所以 这应该在评论部分。
    猜你喜欢
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多