首页 文章

Laravel view.php在base_path中使用config :: get变量

提问于
浏览
1

我试图在laravel 5.2 view.php(编辑base_path以在字符串中使用配置变量)中执行此操作:

<?php

use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Request;

return [

/*
|--------------------------------------------------------------------------
| View Storage Paths
|--------------------------------------------------------------------------
|
| Most templating systems load templates from disk. Here you may specify
| an array of paths that should be checked for your views. Of course
| the usual Laravel view path has already been registered for you.
|
*/

'paths' => [
    realpath(base_path('resources/views/layouts/' . Config::get('api.' . Request::get('domain') . '.layout'))),
],

但是现在我收到了这个错误:

致命错误:/Applications/AMPPS/www/loan/vendor/laravel/framework/src/Illuminate/Container/Container.php:734中未捕获的异常'ReflectionException',消息'类日志不存在'堆栈跟踪:#0 /Applications/AMPPS/www/loan/vendor/laravel/framework/src/Illuminate/Container/Container.php(734):ReflectionClass - > __ construct('log')#1 / Applications / AMPPS / www / loan / vendor / laravel / framework / src / Illuminate / Container / Container.php(629):Illuminate \ Container \ Container-> build('log',Array)#2 / Applications / AMPPS / www / loan / vendor / laravel / framework / src /Illuminate/Foundation/Application.php(697):Illuminate \ Container \ Container-> make('log',Array)#3 / Applications / AMPPS / www / loan / vendor / laravel / framework / src / Illuminate / Container / Container.php(849):Illuminate \ Foundation \ Application-> make('Psr \ Log \ LoggerI ...')#4 / Applications / AMPPS / www / loan / vendor / laravel / framework / src / Illuminate / Container / Container.php(804):Illuminate \ Container \ Container-> resolveClass(Object(ReflectionParameter))#5 / Applications / AMPPS / www / loan / vendor / l在/Applications/AMPPS/www/loan/vendor/laravel/framework/src/Illuminate/Container/Container.php 734行

我该如何解决?因为我尝试的一切都行不通 . 提前谢谢!

3 回答

  • 1

    你需要将这个逻辑移到你的 ViewServiceProvider 而不是试图直接在配置文件中这样做,这是一个很大的不 .

    所以我们要做的是

    php artisan make:provider MyViewServiceProvider
    

    这将导致文件存在于:

    App\Providers\MyViewServiceProvider
    

    现在我们要打开 config/app.php . 在此文件中找到现有的 ViewServiceProvider::class ,并将其替换为上面的命名空间路径 . 它应该看起来像这样:

    //the old Illuminate\View\ViewServiceProvider::class
    App\Providers\MyViewServiceProvider::class,
    

    现在在 registerViewFinder() 函数内部,我们可以重载视图路径 .

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\Facades\Config;
    
    public function registerViewFinder()
    {
        $this->app->bind('view.finder', function ($app) {
            $custom_path = base_path('resources/views/layouts/' . Config::get('api.' . $this->app->request()->get('domain') . '.layout')
            $paths = array_merge(
                [$custom_path],
                $app['config']['view.paths']
            );
    
            return new FileViewFinder($app['files'], $paths);
        });
    }
    

    走这条路线将确保首先观察您的路径 . 如果在该路径中找不到该视图,则可以回退到 Laravel 的默认视图路径 .

    Edit

    重要的是要注意您的类需要扩展默认的ViewServiceProvider,并且必须声明其他2个函数,整个文件应如下所示:

    <?php
    
    namespace App\Providers;
    
    use Illuminate\View\ViewServiceProvider;
    use Illuminate\Support\Facades\Config;
    
    class MyViewServiceProvider extends ViewServiceProvider
    {
        /**
         * Bootstrap the application services.
         *
         * @return void
         */
        public function boot()
        {
            parent::boot();
        }
    
        /**
         * Register the application services.
         *
         * @return void
         */
        public function register()
        {
            parent::register();
        }
    
        /**
         * Register the view finder implementation.
         *
         * @return void
         */
        public function registerViewFinder()
        {
            $this->app->bind('view.finder', function ($app) {
                $custom_path = base_path('resources/views/layouts/' . Config::get('api.' . $this->app->request->get('domain') . '.layout')
                $paths = array_merge(
                    [$custom_path],
                    $app['config']['view.paths']
                );
    
                return new FileViewFinder($app['files'], $paths);
            });
        }
    }
    
  • 1

    简短回答:是的 . 将其添加到文件顶部:

    use Illuminate\Support\Facades\Config;
    
  • 0

    您可以在应用程序的配置文件中使用configrequest -helpers .

    'paths' => [
        realpath(base_path(
            'resources/views/layouts/' . config('api.' . request('domain') . '.layout')
        )),
    ],
    

相关问题