【问题标题】:Laravel Package CreationLaravel 包创建
【发布时间】:2018-07-26 04:07:04
【问题描述】:

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

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

我也有一个预先存在的 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();
        });
    }
}

【问题讨论】:

  • 您是如何让 composer 知道您在 app 中拥有一个需要由 composer 管理的 composer 包?你在哪里跑composer install

标签: php laravel package


【解决方案1】:

我遇到了类似的问题。

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

 namespace Company\LaravelPackageMyPackage

同时检查你的 Facade 是否返回了正确的字符串

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

在您的 ServiceProvider 注册方法中

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

编辑

你已经写了 laravelpackageMyPackage 但它应该是你的 getFacadeAccessor() 中的 laravelpackagemypackage

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

use MyPackage;

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

尝试直接调用门面

公司\LaravelPackageMyPackage\Facade::test()

【讨论】:

  • 非常感谢您的提示!命名空间:“Company\LaravelPackageMyPackage”在所有 3 个文件和 composer.json 中都是相同的。我也有这个“laravelpackagemypackage”作为外观字符串,这两个地方都是一样的,但仍然找不到类'MyPackage':-(
  • @Donal.Lynch.Msc 好的。顺便说一句,它应该是 \MyPackage::test()。它不应该是 MyPackage::test()。您还可以分享您的服务提供商和 MyPackage 以及您的文件结构吗?
  • 当我从 \MyPackage::test() 更改它时。到 MyPackage::test() 错误然后更改为:“找不到类 'App\Http\Controllers\MyPackage'”。另外,更新的问题。
  • @Donal.Lynch.Msc 看起来您的绑定不匹配并获得 getFacadeAccessor
  • 这只是上传代码时出现的复制和粘贴错误。固定问题。
猜你喜欢
  • 1970-01-01
  • 2015-04-14
  • 2021-10-30
  • 2014-06-25
  • 1970-01-01
  • 2015-04-13
  • 2015-11-30
  • 2016-04-05
  • 2018-06-11
相关资源
最近更新 更多