Function mimo třídu – robotLoader ji nevloží

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
nettolog
Člen | 68
+
0
-

Zdravím. Chtěl jsem si stáhnout a vyzkoušet jednu třídu, která je v souboru a ten vypadá takto:

<?php

namespace Tinify;

const VERSION = "0.9.1";

class Tinify {
    public static $key = NULL;
    public static $appIdentifier = NULL;
    public static $compressionCount = NULL;

    public static $client = NULL;

    public static function getClient() {
        if (!self::$key) {
            throw new AccountException("Provide an API key with Tinify.key = ...");
        }

        if (!self::$client) {
            self::$client = new Client(self::$key);
        }

        return self::$client;
    }
}

function setKey($key) {
    Tinify::$key = $key;
    Tinify::$client = NULL;
}

function setAppIdentifier($appIdentifier) {
    Tinify::$appIdentifier = $appIdentifier;
}

function fromFile($path) {
    return Source::fromFile($path);
}

function fromBuffer($string) {
    return Source::fromBuffer($string);
}

function validate() {
    try {
        Tinify::getClient()->request("post", "/shrink");
    } catch (ClientException $e) {
        return true;
    }
}

function compressionCount() {
    return Tinify::$compressionCount;
}

Robotloader třídu vloží pokud ji potřebuji, to je v pořádku. Ale vůbec nemůžu zavolat například setKey (Call to undefined function setKey()), je možné, že se robotloaderem ty functions nenačetly nebo dělám někde chybu já?

V manuálu je postup:

Tinify\setKey('YOUR_KEY');

Například $t = new \Tinify\Tinify; jde bez problému.

Editoval nettolog (31. 7. 2015 19:23)

CZechBoY
Člen | 3608
+
+2
-

Kam sis tu službu injectnul?

Takhle by třeba vypadal presenter:

/**
  * @var \Tinify\Tinify
  */
private $tinify;

public function injectTinify (\Tinify\Tinify $tinify)
{
    $this->tinify = $tinify;
    $tinify->setKey('moje tajne key')
}

Samá statika, wtf…

David Matějka
Moderator | 6445
+
+2
-

PHP nepodporuje autoloading funkci. Ale udelej to tak, jak rika @CZechBoY

nettolog
Člen | 68
+
0
-

Díky, takže bych měl v config.neon zaregistrovat službu \Tinify\Tinify, pochopil jsem tě správně? Ono mi to totiž píše:

Class \Tinify\Tinify used in service '38_Tinify_Tinify' not found or is not instantiable.

Přitom ta třída je určitě ve složce, kterou robotloader prohledává.

Šaman
Člen | 2666
+
0
-

Ne, problém není v injectování. Problém je v tom, že RobotLoader (nebo Composer, v tomhle to vyjde nastejno) si namapuje jen třídy. Funkce mimo třídy to ignoruje. (Předpokládá se, že programujeme objektově a tohle slušné objekty nejsou.) Takže by bylo ideální si tu třidu přepsat do objektů, resp. aspoň si z ní vytvořit statickou třídu s funkcemi.
Druhá možnost (ale veelmi ošklivá) by byla includovat si ten soubor kam potřebuješ, klidně i do presenteru, nebo modelové třídy, která by to obalila. Tzn. použít obyčejné PHP require (nebo include, to je na tobě).

Mimochodem, asi budeš potřebovat i soubor a třidu Source.

Editoval Šaman (31. 7. 2015 20:27)

nettolog
Člen | 68
+
0
-

Aha, díky moc za komentář. Myslel jsem si to. To je škoda, že je to takhle napsané, ale teoreticky mi bude stačit, když to zapnu jednou za čas, takže zvolím nárazové require. Díky ještě jednou.

h4kuna
Backer | 740
+
+1
-

Pokud používáš composer použij pro načtení funkcí, načítání souborů

nettolog
Člen | 68
+
0
-

Díky moc za radu. Jak říkáš, vytvořil jsem si autoload z composeru a ten jen includnu, pokud s tou třídou potřebuji pracovat.