Laravel 5 package bouwen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mbenjamins
  • Registratie: December 2012
  • Laatst online: 11-09 20:18
Hallo,

Ik ben bezig om mijn eerste package te maken voor Laravel 5 maar krijg steeds de error.
PHP:
1
Class 'MBenjamins\Serverinfo\ServiceProvider' not found


Ik heb een map in vender aangemaakt maar begreep dat je het beste een nieuwe map in de root kunt aanmaken en daar je eigen package in te zetten.

Hieronder mijn composer.json die in de root van Laravel staat.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "laravel/framework": "5.0.*",
        "barryvdh/laravel-ide-helper": "^2.0",
        "barryvdh/laravel-debugbar": "^2.0"
    },
    "require-dev": {
        "phpunit/phpunit": "~4.0",
        "phpspec/phpspec": "~2.1"
    },
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
    "autoload-dev": {
        "classmap": [
            "tests/TestCase.php"
        ]
    },
    "scripts": {
        "post-install-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "pre-update-cmd": [
                "php artisan clear-compiled"
            ],
        "post-update-cmd": [
            "php artisan optimize"
        ],
        "post-create-project-cmd": [
            "php -r \"copy('.env.example', '.env');\"",
            "php artisan key:generate"
        ]
    },
    "config": {
        "preferred-install": "dist"
    }
}

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 13:23
mbenjamins schreef op dinsdag 09 juni 2015 @ 09:50:
[...]


Ik heb de code alleen lokaal staan.
Hieronder de inhoud van mijn composer.json
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
    "name": "mbenjamins/serverinfo",
    "description": "",
    "keywords": [],
    "license": "",
    "authors": [
        {
            "name": "Marcel Benjamins",
            "email": "marcelbenjamins@gmail.com"
        }
    ],
    "require": {
        "php": ">=5.4.0",
        "illuminate/support": "5.0.x"
    },
    "autoload": {
        "psr-4": {
            "MBenjamins\\Serverinfo\\": "src/"
        }
    },
    "minimum-stability": "dev"
}
Zolang je hem nog niet met Composer inlaadt, worden bestanden niet door het composer.json bestand van je package geladen. Je moet dus eigenlijk hetzelfde doen met je root composer.json

Daar staat nu deze sectie al in:

JavaScript:
1
2
3
4
5
6
7
8
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },


Daar kan je je eigen library aan toe voegen. Stel dat je hem nu in 'lib/serverinfo' hebt staan, dan zou je dus zoiets krijgen:

JavaScript:
1
2
3
4
5
6
7
8
9
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/",
            "MBenjamins\\Serverinfo\\": "lib/serverinfo/src/"
        }
    },


Door dan 'composer dump-autoload' te draain (in je root project map) wordt lib/serverinfo toegevoegd aan je classmap en kan je hem wel laden.

Wat je overigens ook kan doen is om gewoon je project online te zetten (Github of Bitbucket) en dan handmatig in te voeren (als je hem nog niet wil registreren). Zie https://getcomposer.org/doc/05-repositories.md#vcs

Dan cloned hij een kopie in de vendor map en zou je kunnen testen hoe het 'echt' werkt. En als je autoloading met PSR-4 goed gaat, kan je ook gewoon bestanden toevoegen ed. in dezelfde namespace en worden ze meteen ingeladen.

Acties:
  • 0 Henk 'm!

  • mbenjamins
  • Registratie: December 2012
  • Laatst online: 11-09 20:18
Ik heb het nu in de providers geactiveerd en krijg geen errors :) maar als ik de volgende commando uitvoer
php artisan ide-helper:generate

dan krijg ik de volgende melding:
Exception: Class serverinfo does not exist
Skipping \MBenjamins\Serverinfo\Facade.

En ik krijg het ook niet voor elkaar om een functie aan te roepen die ik in Serverinfo.php heb staan.

Mijn ServerProvider.php ziet er als volg uit
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php namespace MBenjamins\Serverinfo;

class ServiceProvider extends \Illuminate\Support\ServiceProvider {

    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = false;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        return new Serverinfo();
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return array('serverinfo');
    }
}


En mijn Serverinfo.php als volgt
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php namespace MBenjamins\Serverinfo;

class Serverinfo {

    public function __contruct() {
        parent::__contruct();
    }

    public function __construct(array $settings = array()) {

    }

    public function test() {
        return 'Test';
    }
}

Acties:
  • 0 Henk 'm!

  • InFamous
  • Registratie: Januari 2010
  • Laatst online: 08:22

InFamous

excommunicado

PHP:
1
2
3
    public function __contruct() {
        parent::__contruct();
    }


Moet dat niet conStruct zijn?

Formerly known as Ragdoll


Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 13:23
En je register functie registreert niet echt iets...

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 13:23
mbenjamins schreef op woensdag 10 juni 2015 @ 19:36:
Ik heb het nu in de providers geactiveerd en krijg geen errors :) maar als ik de volgende commando uitvoer
php artisan ide-helper:generate

dan krijg ik de volgende melding:
Exception: Class serverinfo does not exist
Skipping \MBenjamins\Serverinfo\Facade.
Je hebt dus een Facade, die verwijst naar de container instance 'serverinfo'. Maar die bestaat niet, vandaar de fout. Dit voorbeeld is overigens specifiek voor mijn IDE helper, omdat die alle Facades probeert. Als je zelf je Facade zou aanroepen, krijg je waarschijnlijk dezelfde fout.
mbenjamins schreef op woensdag 10 juni 2015 @ 19:36:
En ik krijg het ook niet voor elkaar om een functie aan te roepen die ik in Serverinfo.php heb staan.

Mijn ServerProvider.php ziet er als volg uit
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php namespace MBenjamins\Serverinfo;

class ServiceProvider extends \Illuminate\Support\ServiceProvider {

    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = false;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        return new Serverinfo();
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return array('serverinfo');
    }
}
die 'provides()' functie geeft aan wat je in de app container registreert, in jouw geval dus 'serverinfo'. Dat klopt, want dat verwacht je facade ook etc. Maar dan moet je dat ook wel doen in de 'register()' method.

PHP:
1
2
3
4
5
6
public function register()
{
    $this->app->singleton('serverinfo', function ($app) {
        return new Serverinfo();
    });
}
mbenjamins schreef op woensdag 10 juni 2015 @ 19:36:
En mijn Serverinfo.php als volgt
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php namespace MBenjamins\Serverinfo;

class Serverinfo {

    public function __contruct() {
        parent::__contruct();
    }

    public function __construct(array $settings = array()) {

    }

    public function test() {
        return 'Test';
    }
}
Dat stukje:

PHP:
1
2
3
    public function __contruct() {
        parent::__contruct();
    }


Is een beetje vreemd. Sowieso extend je geen class, dus er is geen parent. En __contruct() (zonder s) bestaat niet en doet dus ook niets.

Verder zou je evt. nog een alias kunnen geven aan je 'serverinfo' instance, dan kan je hem met dependancy injection gewoon typehinten in je controllers ed.

PHP:
1
$this->app->alias('serverinfo', 'MBenjamins\Serverinfo\Serverinfo');
Pagina: 1