1

我正在使用CodeIgniter 4的最新“主”分支

我有一个试图自动加载的库。实际上,我希望拥有“一个”index.php(具有元、基本的 html 结构等),通过它我可以通过“模板”库加载视图。

我的库文件:(~/app/Libraries/Template.php)

//class Template extends CI_Controller
class Template {

    /* This throws an error, but I will open up a separte thread for this
    public function __construct() {
        parent::__construct();
    }
    */

    public function render($view, $data = array()) {        
        $data['content_view'] = $view;  
        return view('layout/index', $data);     
    }

}

我还设置了一个控制器:

class Locations extends BaseController
{

    public function index()
    {
        return $this->template->render("locations/index", $view_data); 
        //return view('locations/index');
    }

    //--------------------------------------------------------------------

}

在 ~/app/Config/ 我添加了我的库

    $classmap = [
        'Template' => APPPATH .'/Libraries/Template.php'
    ];

我收到以下错误:

Call to a member function render() on null

我做错了什么导致我的库无法加载?

4

3 回答 3

6

在 CI4BaseController中,您可以创建希望被多个其他控制器使用的东西。在 CI4 中创建扩展其他类非常容易。

在我看来,您唯一缺少的就是创建Template课程。(还有其他一些小事,但我该指手画脚吗?)

一件大事可能只是你没有展示它,即使你在做它。那是使用namespaceuse指令。它们是 CI 4 的必做项目。

由于您放置了不需要的文件,因此应该删除以下内容。看看我是如何使用自动加载器已知的use导入的。namespace

$classmap = [
        'Template' => APPPATH .'/Libraries/Template.php'
    ];

一、BaseController

/app/Controllers/BaseController.php

<?php
namespace App\Controllers;

use CodeIgniter\Controller;
use App\Libraries\Template;

class BaseController extends Controller
{

    /**
     * An array of helpers to be loaded automatically upon
     * class instantiation. These helpers will be available
     * to all other controllers that extend BaseController.
     *
     * @var array
     */
    protected $helpers = [];

    protected $template;

    /**
     * Constructor.
     */
    public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
    {
        // Do Not Edit This Line
        parent::initController($request, $response, $logger);

        $this->template = new Template();
    }

}

/app/Controllers/Locations.php

class Locations extends BaseController
{
    public function index()
    {
        // set $viewData somehow
        $viewData['someVar'] = "By Magic!";
        return $this->template->render("locations/index", $viewData);
    }
}

/app/Libraries/Template.php

<?php namespace App\Libraries;

class Template
{
    public function render($view, $data = [])
    {
        return view($view, $data);
    }
}

/app/Views/locations/index.php

This works as if... <strong><?= $someVar; ?></strong>

我知道我还没有完全创建您想要做的事情。但是以上内容应该可以让您到达您想去的地方。无论如何,我希望如此。

于 2019-11-21T23:47:59.613 回答
3

一开始很棘手。但我设法成功运行它

确保你给它正确的命名空间

然后只需在您的控制器位置“使用”。我没有更改 Autoload.php 上的任何内容。

应用程序/库/Template.php

<?php

namespace App\Libraries;

class Template {
    public static function render($param) {
        return 'Hello '.ucwords($param);
    }
}

正确的调用方式放在use App\Libraries\Template前面class Location extends BaseController

应用程序/控制器/Locations.php

<?php

namespace App\Controllers;
use App\Libraries\Template;

class Locations extends BaseController {
    public function index() {
        $template = new Template();
        $renderedStuff = $template->render('World!');
        echo $renderedStuff;
    }
}

这是如何运作的? 注意Template.php有一个命名空间namespace App\Libraries;,因此 CI4 将自动加载该库并正确识别“模板”类。在我看来,这是创建 CI4 库的正确方法。

我们如何使用那个库? 查看我的示例,Locations.php然后查看此代码use App\Libraries\Template;,这就是我们如何调用该库。

我们如何调用函数? 查看index()函数内部,这里我们使用 var 调用类 Template $template = new Template();。然后我们调用render()模板库中的函数$template->render('World!');

就这么简单。我希望这有帮助,让我知道它是否不起作用。:)

于 2020-04-05T21:50:53.707 回答
0

只是一点提示,因为我的眼睛被这CI_Controller部分吸引了。

您似乎在 CI4 中使用 CI3 语法,至少在加载视图方面,它转换为:

$data = [
    'title' => 'Some title',
];

echo view('news_template', $data);

请参阅CI3docCI4doc,“静态页面”教程。

于 2019-11-17T19:42:53.067 回答