Наличие динамического пути к папке View во время выполнения в laravel 5.3

Я пытаюсь создать приложение SAAS (здесь Saas означает программное обеспечение как услуга) в laravel 5.3, Я создал несколько поставщиков услуг, которые собирают доменное имя, используемую тему и базы данных конкретного веб-сайта. Сейчас я пытаюсь реализовать страницы с view structure через service provider, Теперь, например, у меня есть две разные темы для двух разных доменов. У меня есть набор HTML-кода в представлениях в разных папках, что-то вроде этого:

View
----| Theme One
--------| Navbar
--------| Sliders
--------| Tabs
--------| Parallax
--------| Iconbox
--------| template.blade.php
----| Theme Two
--------| Navbar
--------| Sliders
--------| Tabs
--------| Parallax
--------| Iconbox
--------| template.blade.php

Теперь я хочу динамически определить структуру папок для этих доменов, чтобы на ней отображались модули соответствующей темы. Предположим, что если я хочу включить суб-представление Navbar, мне просто нужно написать

@include('Navbar')

и это должно получить доступ к соответствующей папке Navbar темы или вложенному представлению. Я думал о том, чтобы сделать поставщика услуг и попытаться установить через config путь примерно так:

public function boot()
{
    $this->webView = $this->setPath();
    $this->app->singleton('webView', function()
    {
        return $this->webView;
    });
}

public function setPath()
{
    $themename = App::make('themename')
    if($themename)
    {
        $setpath = "..Path\Views\" . $themename;
        Config::set('view.paths', $setpath);
        return null;
    }
    else
    {
        return "Not found";
    }
}

Но я думаю, что когда приложение загрузится, оно проигнорирует конфигурацию, я знаю, что должен быть лучший способ реализовать это. Пожалуйста, ведите меня.

1 ответ

Решение

Сначала создайте ViewServiceProvider в App\Providers как это или копия Illuminate\View\ViewServiceProvider в app/Providers & изменить, как это

<?php

namespace App\Providers;

use Illuminate\View\FileViewFinder;
use Illuminate\View\ViewServiceProvider as ConcreteViewServiceProvider;

class ViewServiceProvider extends ConcreteViewServiceProvider
{
    /**
     * Register the view finder implementation.
     *
     * @return void
     */
    public function registerViewFinder()
    {
        $this->app->bind('view.finder', function ($app) {
            $paths = $app['config']['view.paths'];

            //change your paths here
            foreach ($paths as &$path)
            {
                $path .= time();//change with your requirement here I am adding time value with all path
            }

            return new FileViewFinder($app['files'], $paths);
        });
    }
}

тогда замени Illuminate\View\ViewServiceProvider::class, с App\Providers\ViewServiceProvider::class, в config/app.php, Это сделает свое дело.

Другие вопросы по тегам