【问题标题】:Having a dynamic View folder path during runtime in laravel 5.3在 laravel 5.3 中运行时具有动态视图文件夹路径
【发布时间】:2017-05-25 00:41:52
【问题描述】:

我正在尝试在laravel 5.3 中构建一个 saas 应用程序(这里的 saas 表示软件即服务)。我已经建立了一些服务提供商来收集域名、正在使用的主题和那些特定网站的数据库。现在我正在尝试使用view structureservice 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')

它应该访问相应的主题导航栏文件夹或子视图。我想建立一个服务提供者并尝试通过配置路径设置如下:

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";
    }
}

但我猜当应用程序启动时它会忽略配置,我知道必须有更好的方法来实现它。请指导我。

【问题讨论】:

    标签: laravel laravel-5.3 laravel-blade laravel-views


    【解决方案1】:

    首先像这样在App\Providers中创建一个ViewServiceProvider或复制Illuminate\View\ViewServiceProviderapp/Providers strong> & 像这样改变

    <?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);
            });
        }
    }
    

    然后将 config/app.php 中的 Illuminate\View\ViewServiceProvider::class, 替换为 App\Providers\ViewServiceProvider::class,。这样就可以了。

    【讨论】:

    • 感谢您的回答。现在假设我需要将其更改为存储在变量$themename 中的文件夹themeone,它的位置是somepath\views\themeone 我需要在$path = "somepath\views\".$themename 中写入foreach statement
    • @NitishKumar 是的,这个想法几乎相同,您可以在此处根据您的情况设置路径。
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 2018-07-15
    • 1970-01-01
    • 2014-11-17
    • 2017-12-05
    • 2015-02-12
    • 2017-04-06
    • 2017-01-21
    相关资源
    最近更新 更多