Сообщение об ошибке: вызов функции-члена render () в null - PullRequest
1 голос
/ 26 марта 2020

На самом деле я пытаюсь вызвать мой файл ветки с моего контроллера, и вот мой код:
Это мое приложение. php

<?php

use Slim\App;
use Slim\Http\Environment;
use Slim\Http\Uri;
use Slim\Views\Twig;
use Slim\Views\TwigExtension;

$app = new App (['settings' => ['displayErrorDetails' => true,],]);
$container = $app->getContainer();
$container['view'] = function ($container) {
    $view = new Twig('../Resources/Views/Users', ['cache' => false]); // Instantiate and add Slim specific extension$router = $container->get('router');$uri = Uri::createFromEnvironment(new Environment($_SERVER));$view->addExtension(new TwigExtension($router, $uri));return $view;};require __DIR__ . '/../Routes/routes.php';
};

Это маршруты. php: -

<?php
$app->group('/profile', function () {
    $this->get('/fetchMyLiveAds', Application\Controllers\COlxMyAdsController::class . ':fetchMyLiveAdIdsByUserId');
    $this->get('/fetchMyDeniedAds/{id}', Application\Controllers\COlxMyAdsController::class . ':fetchMyDeniedAdIdsByUserId');
    $this->get('/fetchMyPendingAds/{id}', Application\Controllers\COlxMyAdsController::class . ':fetchMyPendingAdIdsByUserId');
});

Это мой COlxDatabaseHandler: - Вы решили мою проблему, но теперь, когда я вызываю fetchMyLiveAds () с объектом COlcUserDetails то есть $ this-> m_objOlxUserDetails, теперь он показывает мне ошибку, которая вызывает fetchMyLiveAds () для Null.

<?php
namespace Application\Eos;
use Psr\Container\ContainerInterface;

class COlxDatabaseHandler extends Container{

    public function __construct( ContainerInterface $c ) {

        $this->m_objOlxCategories      = new COlxCategories( $c );
        $this->m_objOlxProductImages   = new COlxProductImages( $c );
        $this->m_objOlxProducts        = new COlxProducts( $c );
        $this->m_objOlxProductStatuses = new COlxProductStatuses( $c );
        $this->m_objOlxStatuses        = new COlxStatuses( $c );
        $this->m_objOlxUserInterests   = new COlxUserInterests( $c );
        $this->m_objOlxUserLikes       = new COlxUserLikes( $c );
        $this->m_objOlxUserPurchases   = new COlxUserPurchases( $c );
        $this->m_objOlxUserDetails     = new COlxUserDetails( $c );
    }
}
?>

это класс COlxMyAdsController:

COlxMyAdsController extends COlxDatabaseHandler {
    public
    function fetchMyLiveAdIdsByUserId(Request $request, Response $response)
    {
        $args = $request->getParams();
        $args = $args['id'];
        $result = count($this->m_objOlxUserDetails->fetchMyLiveAdIdsByUserId($args));
        // Here the result stores int(3)
           return $view->render($response,'profile.twig',['counts'=> $result]);
           or return $this->view->render($response,'profile.twig',['counts'=> $result]);
    }
}

это профиль. веточка:

<div class="CSlider" ><div class="CProducts" ><table ><tr >{
    %
    for count in 1. . counts %}<td >{
    %
    block tile %}{
    %
    include 'tile.twig' %}{
    %
    endblock %}</td >{
    %
    if count is divisible by(6) %}</tr ><tr >{
    % endif %
}{
    % endfor %
}</table ></div ></div >

И это div, где я хочу использовать этот результат

1 Ответ

0 голосов
/ 26 марта 2020

Во-первых, вам нужно return создать объект из определения закрытия:

$container['view'] = function ($container) {
    // create Twig instance and set up appropriately
    $view = new Twig(...);
    // add extensions, etc...
    // You MUST return the created instance
    return $view;
};

При создании экземпляра контроллера Slim передает экземпляр контейнера конструктору контроллера в качестве первого аргумента, поэтому в контроллере конструктор, вы можете получить view из контейнера и сохранить его в закрытой или защищенной переменной, а затем использовать его в обратном вызове маршрута:

COlxMyAdsController extends COlxDatabaseHandler {

    protected $view;

    public function __construct($container) {
        $this->view = $container->get('view');
    }

    public function fetchMyLiveAdIdsByUserId(Request $request, Response $response)
    {
        // logic goes here
        // ...
        return $this->view->render($response,'profile.twig',['counts'=> $result]);
    }

}
...