PSR-4在Laravel中自动加载

时间:2017-12-28 21:01:20

标签: php json laravel autoload psr-4

处理将用于扩展Chatter

的应用程序

问题是,我想对软件包进行修改但不想直接对软件包进行修改。在composer update

之后,更改将不会继续存在。

根据我的理解,扩展包需要我从自动加载中排除特定文件并加载我自己的文件/目录......

composer.json

我对composer.json进行了更改以适应Mac / Unix和Windows文件路径语法:

"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "exclude-from-classmap": [
        "vendor/devdojo/chatter/src/Controllers/ChatterDiscussionController.php",
        "vendor/devdojo/chatter/src/Models/Discussion.php",
        "vendor\\devdojo\\chatter\\src\\Controllers\\ChatterDiscussionController.php",
        "vendor\\devdojo\\chatter\\src\\Models\\Discussion.php"
    ],
    "psr-4": {
        "App\\": "app/",
        "Forum\\": "app/forum"
    }
},

文件夹结构

.
+-- app
|   +-- Console
|   +-- Exceptions
|   +-- Forum
    |   +-- Chatter
        |   +-- Controllers
            |   +-- ChatterDiscussionController.php
        |   +-- Models
            |   +-- ...
|   +-- Helpers
|   +-- Http
|   +-- ...
+-- bootstrap
+-- ...

自定义ChatterDiscussionController.php

<?php

namespace Forum\Chatter\Controllers;

use Auth;
use Carbon\Carbon;
use DevDojo\Chatter\Events\ChatterAfterNewDiscussion;
use DevDojo\Chatter\Events\ChatterBeforeNewDiscussion;
use DevDojo\Chatter\Models\Models;
use Event;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as Controller;
use Validator;
use App\User;

class ChatterDiscussionController extends Controller
{...

测试

为了测试这一点,我在我的自定义DiscussionController中放置了dd("Custom"),在DiscussionController的包版本中放置了dd("Original")。正如您可能已经猜测的那样,这继续触及DiscussionController的包版本。

我实现此功能的唯一方法是将特定文件添加到自动加载部分"files": ["app/Helpers/Chatter.php"]中的文件密钥 &lt; ~~这是一个示例 。一旦我开始扩展越来越多的包,这将是一个管理的噩梦。根据我的理解,这可以通过创建ServiceProvider来完成,但是我无法找到使用该方法使其工作的合适示例。

以前有人有这个问题吗?解决了什么?非常感谢任何正确方向的帮助。

0 个答案:

没有答案