laravel 5.3 在运行时拥有动态视图文件夹路径
Having a dynamic View folder path during runtime in laravel 5.3
我正在尝试在 laravel 5.3
中构建一个 saas 应用程序(这里的 saas 表示软件即服务)。我已经建立了一些收集域名、正在使用的主题和那些特定网站的数据库的服务提供商。现在我正在尝试使用 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')
它应该访问相应的主题导航栏文件夹或子视图。我想做一个服务提供者并尝试通过配置设置这样的路径:
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";
}
}
但我想当应用程序启动时它会忽略配置,我知道一定有更好的方法来实现它。请指导我。
首先像这样在App\Providers
中创建一个ViewServiceProvider
或者复制[= app/Providers
中的 13=] 并像这样更改
<?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,
in config/app.php
。这样就可以了。
我正在尝试在 laravel 5.3
中构建一个 saas 应用程序(这里的 saas 表示软件即服务)。我已经建立了一些收集域名、正在使用的主题和那些特定网站的数据库的服务提供商。现在我正在尝试使用 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')
它应该访问相应的主题导航栏文件夹或子视图。我想做一个服务提供者并尝试通过配置设置这样的路径:
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";
}
}
但我想当应用程序启动时它会忽略配置,我知道一定有更好的方法来实现它。请指导我。
首先像这样在App\Providers
中创建一个ViewServiceProvider
或者复制[= app/Providers
中的 13=] 并像这样更改
<?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,
in config/app.php
。这样就可以了。