Задать вопрос
@sequelone

Как правильно указать в сервис провайдере своего пакета папку public из vendor?

Всем привет. Начал разработку своего пакета. Установил символьную ссылку на свой пакет в composer.json (который в корне):
"repositories": {
        "package-name": {
            "type": "path" ,
            "url": "packages/sequelone/sone" ,
            "options": {
                "symlink": true
            }
        }
    },

Затем в папке с пакетом по пути /packages/sequelone/sone/src в сервис провайдер SoneServiceProvider.php добавил в функцию boot() подгрузку роутов и всего остального:
namespace Sequelone\Sone;

use Illuminate\Support\ServiceProvider;

class SoneServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->publishes([
            __DIR__.'/../config/sone.php' => config_path('sone.php'),
        ], 'config');
        
        $this->mergeConfigFrom(
            __DIR__.'/../config/sone.php', 'sone'
        );
        
        $this->loadRoutesFrom(__DIR__.'/../routes/web.php');

        $this->loadViewsFrom(__DIR__.'/../resources/views/', 'sone');
        
        $this->publishes([
            __DIR__ . '/../../views' => base_path('resources/views/vendor/sone')
        ]);
        
        $this->publishes([
            __DIR__ . '/../../vendor/sequelone/sone/public' => public_path('vendor/sone'),
        ], 'public');
        
        $this->publishes([
            __DIR__.'/../public' => public_path('/'),
        ], 'public');
    }
}

только вот по дефолту папка public (которая в пакете не хочет подгружаться, файлы имеют статус 404 ошибки).

Как я понимаю надо настроить это:
$this->publishes([
            __DIR__ . '/../../vendor/sequelone/sone/public' => public_path('vendor/sone'),
], 'public');

P.S. Если выполнять команду:
php artisan vendor:publish --tag=public --force
то содержимое публикуется в основную папку public. Как всё таки настроить этот путь, чтобы файлы отдавались из папки vendor?
  • Вопрос задан
  • 54 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@sequelone Автор вопроса
Судя по всему без публикаций в основную папку ничего работать не будет. Решение вот такое.

В сервис провайдере своего пакета пишем путь до публикации:

$this->publishes([
            __DIR__ . '/../public' => public_path('vendor/sone'),
        ], 'Sone-public');


В папке public пакета находятся все файлы и папки (например: /img/, /js/, /css/).

Чтобы автоматизировать все это, добавить следующие записи в composer.json в секцию scripts: раздел "post-install-cmd" и "post-update-cmd":

"scripts": {
    "post-install-cmd": [
          "...",
          "php artisan vendor:publish --tag=public --force"
    ],
    "post-update-cmd": [
          "...",
          "php artisan vendor:publish --tag=public --force"
    ],
},


Как видно из названий секций одна выполняется при установке пакета через Composer, а другая при обновлении. По логике, туда же можно добавлять и другие artisan команды для автоматизации процессов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы