使用Composer在Laravel中包含View Composers

时间:2014-06-09 07:05:08

标签: php laravel-4 composer-php blade

我为我的应用制作了以下composer view。我已将其放在 app / composers.php 的单独文件中。

<?php

// namespace App\Modules\Manager\Composer;
// use Illuminate\Support\Facades\View as View ;

/*
|--------------------------------------------------------------------------
| Composers
|--------------------------------------------------------------------------
|
|
*/


View::composer('tshop.includes.header', function($view)
{

    $categories = Categories::getWithChilds();

    $view->withCategories( $categories);

});

我的 composer.php 文件是

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php"
    ],
    "files": [
        "app/composers.php"
    ]
},

不幸的是我收到了这个错误

Fatal error: Class 'View' not found in C:\xampp\htdocs\eshop\app\composers.php on line 15

更新

我也尝试过这个。我在 app / start / global.php

里面写道
require app_path().'/composers.php';

use Illuminate\Support\Facades\View as View ;

app / composers.php ,收到此错误

  

致命错误:在非对象中调用成员函数composer()   C:\ XAMPP \ htdocs中\商铺\供应商\ laravel \框架的\ src \照亮的\ Support \外立面\ Facade.php   在211行

2 个答案:

答案 0 :(得分:7)

我认为你的app/composers.php不应该在作曲家中自动加载。 Composer的职责是解决包并为您安装它们,这与您的应用程序逻辑无关,更不用说您的应用程序的视图了。

在运行作曲家时,它不会了解您的Laravel应用程序。这意味着您的Laravel外墙(如ViewInputDBAuth等尚未加载。因此,您的代码会抛出Call to a member function composer() on a non-object


方法1:

Laravel并未严格指定您放置laravel视图作曲家的位置,因此需要添加:

require app_path() . '/composers.php';
<{1>}底部的{p> edi9999表示没问题。

在这种情况下不要忘记删除:

app/start/global.php

方法2:有一种方法可以在composer.json中自动加载你的视图作曲家!

Laravel docs on view composers中的示例中,您可以执行类似......

的操作

应用程序/ viewcomposers / HeaderViewComposer.php:

"files": [
    "app/composers.php"
]

composer.json:

class HeaderViewComposer
{
    public function compose($view)
    {
        $categories = Categories::getWithChilds();
        $view->withCategories( $categories);
    }
}

应用程序/ composers.php:

"classmap": [
    ...
    "app/viewcomposers"
]

app / start / global.php的底部:

View::composer('tshop.includes.header', 'HeaderViewComposer');

不幸的是,您仍然需要将上面的行添加到require app_path() . '/composers.php'; ,以便Laravel知道定义了哪些视图作曲家。


方法3:在composer.json中自动加载类+注册自定义ServiceProvider

Philip Brown从Using View Composers in Laravel 4学习,我们也可以添加自己的自定义服务提供商,而无需编辑app/start/global.php文件。

应用程序/ viewcomposers / HeaderViewComposer.php:

app/start/global.php

composer.json:

<?php namespace App\Modules\Manager\Composer;

class HeaderViewComposer
{
    public function compose($view)
    {
        $categories = Categories::getWithChilds();
        $view->withCategories( $categories);
    }
}

应用程序/ viewcomposers / ViewComposerServiceProvider.php:

"classmap": [
    ...
    "app/viewcomposers"
]

应用程序/配置/ app.php:

<?php namespace App\Modules\Manager\Composer;

use Illuminate\Support\ServiceProvider;

class ViewComposerServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->view->composer('tshop.includes.header', 'App\Modules\Manager\Composer\HeaderViewComposer');
    }

}

答案 1 :(得分:6)

正如@TheShiftExchange发现的那样,一个问题是您使用了“文件”选项。

正如您在作曲家的代码中看到的那样,自动加载部分对应于:

class ComposerAutoloaderInitf8489489s7f894ds98f47d
{
    ....
    ....
    public static function getLoader()
    {
        ....
        ....
        $includeFiles = require __DIR__ . '/autoload_files.php';
        foreach ($includeFiles as $file) {
            composerRequiref4s65f4556sd4f564fsdfd($file);
        }

        return $loader;
    }
}

function composerRequire5894s89f4sd98498489f7b37d($file)

{
    require $file;
}

因此,在编辑器的自动加载过程中,在加载View Facade之前,需要指定的文件数组。

外墙的提供者加载在vendor/laravel/framework/illuminate/foundation/start.php

/*
|--------------------------------------------------------------------------
| Register The Core Service Providers
|--------------------------------------------------------------------------
|
| The Illuminate core service providers register all of the core pieces
| of the Illuminate framework including session, caching, encryption
| and more. It's simply a convenient wrapper for the registration.
|
*/

$providers = $config['providers'];

$app->getProviderRepository()->load($app, $providers);

实际上,类映射的问题是另一个问题:它们在文件中不是类,因此永远不会加载文件,因此它不会执行任何操作。

要使其正常工作,您应该在文件末尾添加app/start/global.php

而不是

require app_path() . '/filters.php';

require app_path() . '/composers.php';
require app_path() . '/filters.php';

这是我能想到的最好的方法,即在每个非应用程序的应用程序中包含文件。