Estoy trabajando desde el esqueleto Slim 3 y tratando de usar MonoLog en una clase personalizada que he creado que se llama Utilidades.

Utilities.php - que se requiere de index.php

<?php

class Utilities {

    protected $logger;

    function __construct($c) {
        $this->logger = $logger;
    }

    static function checkPerms() {
        $this->logger->info("checkPerms() permissions of user id valid.");
        return true;
    }

}

Dependencies.php: agregué lo siguiente:

$container['utilities'] = function ($c) {
    return new Utilities($c->get('logger'));   
};

Pero recibo el error de:

Mensaje: usando $ this cuando no está en el contexto del objeto

Archivo: /Applications/MAMP/htdocs/project/src/utilities.php

Debo estar perdiendo algo pero no estoy seguro de qué.

0
Elliot Reeve 16 oct. 2018 a las 22:56

2 respuestas

La mejor respuesta

Refactorizaría Utilities.php un poco:

<?php

class Utilities
{

    protected $logger;

    function __construct($logger)
    {
        $this->logger = $logger;
    }

    public function checkPerms()
    {
        $this->logger->info("checkPerms() permissions of user id valid.");

        return true;
    }

}
1
odan 18 oct. 2018 a las 06:46

Hay al menos dos cosas importantes que sugeriría.

La primera es que un método estático no puede llamar a $ this. En Slim Skeleton, verá que se llama al registrador mediante el método mágico __invoke. No tiene que ser un método mágico, pero no una "función estática" para acceder a $ this.

El segundo es el constructor. Aunque en sus dependencias especificó que desea recuperar el registrador del contenedor, su constructor actual no se refiere a él. Eso se ve de nuevo en el modelo de esqueleto de Slim. Si no desea utilizar las declaraciones "use", puede hacer:

function __construct(\Psr\Log\LoggerInterface $logger) {
    $this->logger = $logger;
}

De esta manera, el contenedor le proporcionará el $ logger que necesita y luego podrá usar métodos no estáticos para llamarlo.

<?php
namespace App\Action;

use Slim\Views\Twig;
use Psr\Log\LoggerInterface;
use Slim\Http\Request;
use Slim\Http\Response;

final class HomeAction
{
    private $view;
    private $logger;

    public function __construct(Twig $view, LoggerInterface $logger)
    {
        $this->view = $view;
        $this->logger = $logger;
    }

    public function __invoke(Request $request, Response $response, $args)
    {
        $this->logger->info("Home page action dispatched");

        $this->view->render($response, 'home.twig');
        return $response;
    }
}

Buena suerte para ti

1
farhang 16 oct. 2018 a las 22:56