Laravel包创建

时间:2018-07-25 17:55:06

标签: php laravel package

所以我正在编写一个Laravel软件包,该软件包最终将存在于git(或任何地方)上。

我已经在/ app /中创建了此处概述的包结构(https://rathes.de/blog/en/laravel-package,顺便说一句资源),并且还创建了Facade.php,PackageServiceProvoder.php和转储的控制器“ Hello world”到浏览器。

我也有一个预先存在的HomeController.php,并在测试函数中添加了以下内容:

dd(\MyPackage::test());// <-- Should dump "Hello world" and die.

我还已将以下内容添加到软件包的composer.json文件中并运行composer install:

"autoload": {
    "psr-4": {
        "Company\\LaravelPackageMyPackage\\": "src"
    }
},
"autoload-dev": {
    "psr-4": {
        "Company\\LaravelPackageMyPackage\\Test\\": "tests"
    }
},
"extra": {
    "laravel": {
        "providers": [
"Company\\LaravelPackageMyPackage\\Lar...kageServiceProvider"
        ],
        "aliases": {
            "MyPackage": "Company\\LaravelPackageMyPackage\\Facade"
        }
    }
},

我的问题是,当我在浏览器中运行它时,出现以下错误:

Class 'MyPackage' not found // <-- references the dd() line of code above

我一定错过了本教程中的某个步骤或类似的步骤,因为据我所知它应该现在可以正常工作。 有什么建议吗?

Laravel 5.5,PHP 7.1,Ubuntu Linux操作系统。

只需在下面的代码:

File structure (very similar to this):
Project -> app -> my-package /

├── database/
│   ├── .gitkeep
├── config/
│   ├── package-name.php
├── src/
│   ├── PackageNameServiceProvider.php
├── tests/
│   ├── TestCase.php
├── .gitignore
├── CHANGELOG.md
├── composer.json
├── LICENSE
├── phpunit.xml
├── README.md

// FACADE:
<?php
namespace Company\LaravelPackageMyPackage;

class Facade extends \Illuminate\Support\Facades\Facade
{
    /**
     * {@inheritDoc}
     */
    protected static function getFacadeAccessor()
    {
        return 'laravelpackagemypackage';
    }
}

// MY PACKAGE
<?php
namespace Company\LaravelPackageMyPackage;

class LaravelPackageMyPackage
{
    public function test()
    {
        return "Hello From My Package!";
    }
}

// SERVICE PROVIDER:
<?php
namespace Company\LaravelPackageMyPackage;
use Illuminate\Support\Facades\App;
use Illuminate\Support\ServiceProvider;

class LaravelPackageMyPackageServiceProvider extends ServiceProvider
{
    protected $defer = false;

    public function boot()
    {
        //$this->loadMigrationsFrom(__DIR__ . '/../database/migrations/');
    }

    public function register()
    {
        App::bind('laravelpackagemypackage', function () {
            return new LaravelPackageMyPackage();
        });
    }
}

1 个答案:

答案 0 :(得分:1)

我有类似的问题。

确保您的类名称空间与composer.json相同 在您的ServiceProvider和Facade中,命名空间应为

else

还要检查您的Facade是否返回正确的字符串

 namespace Company\LaravelPackageMyPackage

在您的ServiceProvider注册方法中

protected static function getFacadeAccessor()
{
    return 'mypackage';
}

编辑

您已经编写了laravelpackageMyPackage,但是在getFacadeAccessor()中应该是laravelpackagemypackage

编辑 调用MyPackage :: test()时,尝试添加

App::bind('mypackage', function () {
    return new MyPackage();
});

在您的控制器中,如果这不起作用

尝试直接调用外观

Company \ LaravelPackageMyPackage \ Facade :: test()