【问题标题】:Using Twigbridge in a Laravel 5.1 Package在 Laravel 5.1 包中使用 Twigbridge
【发布时间】:2015-06-26 11:24:35
【问题描述】:

我正在尝试创建一个使用 Twigbridge 而不是 .php 视图的 Laravel 5.1 包。我可以获得正常的.php 视图以正常显示,但是当我尝试使用.twig 模板时,我只会遇到错误。在为 Laravel 包创建视图时是否可以使用 Twigbridge 模板,或者我们几乎坚持使用 bladephp

编辑 1: 在不扩展任何内容的情况下加载 Twig 模板。当我开始使用{% extends 'file' %} 时,错误就会出现。

我收到此错误

Error loading /virtual/laravel/packages/username/mypackage/src/Views/sample.twig:
Template "templates.master" is not defined () in
"/virtual/laravel/packages/username/mypackage/src/Views/sample.twig" at line 1.

我的文件夹

username
    |_ mypackage
        |_ src
            |_ Controllers
                - SampleController.php
            |_ Views
                |_ templates
                        - master.twig
                - sample.twig

树枝模板sample.twig

{% extends 'templates.master' %}

{% block content %}
    {{ parent() }}
{% endblock %}

我的 templates/master.twig 文件中有 {% block content %} Hello World {% endblock %}

我的composer.json

{
    "name": "username/mypackage",
    "description": "",
    "license": "MIT",
    "keywords": ["laravel"],
    "authors": [
        {
            "name": "username",
            "email": "username@gmail.com"
        }
    ],
    "require": {
        "rcrowe/twigbridge": "0.7.x"
    },
    "minimum-stability": "stable"
}

我的服务提供商(简体)

<?php namespace Username\MyPackage;

use Illuminate\Support\ServiceProvider;

class MyPackageServiceProvider extends ServiceProvider {

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {   
        // Route
        include __DIR__.'/routes.php';
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        // This line works fine for normal .php views but for some reason not for .twig views
        $this->loadViewsFrom(__DIR__ . '/Views', 'mypackage');

        // Providers
        $this->app->register('TwigBridge\ServiceProvider');

        // Aliases
        $loader = \Illuminate\Foundation\AliasLoader::getInstance();
        $loader->alias('Twig', 'TwigBridge\Facade\Twig');

        $this->app['mypackage'] = $this->app->share(function($app) {
            return new MyPackage;
        });
    }

    /**
    * Register a view file namespace.
    *
    * @param  string  $namespace
    * @param  string  $path
    * @return void
    */
    protected function loadViewsFrom($path, $namespace)  
    {
        if (is_dir($appPath = $this->app->basePath().'/resources/views/vendor/'.$namespace)) {
            $this->app['view']->addNamespace($namespace, $appPath);
        }
        $this->app['view']->addNamespace($namespace, $path);
    }
    /*
    */

}

控制器非常基础

<?php namespace Username\MyPackage\Controllers;

use App\Http\Controllers\Controller;

class SampleController extends Controller {

    public function sample() {
        return view('mypackage::sample');
    }

}

【问题讨论】:

    标签: laravel twig


    【解决方案1】:

    很抱歉回答我自己的问题,但我发现答案是引用包。所以{% extends 'folder.file' %} 变成了{% extends 'packagename::folder/file' %}

    这成功地加载了文件,但它没有回答如何让{{ form_text() }} 等函数工作。由于我使用的是rcrowe/twigbridge,有什么方法可以让这些功能正常工作吗?

    【讨论】:

    • 我必须将twigbridge.php 配置文件从 TwigBridge 供应商包中复制到 Laravel 配置目录中,并取消表单和 Html 扩展。如果有更好的方法来扩展包配置而不复制整个文件,我很高兴听到它:)
    • 你可以运行php artisan vendor:publish --provider="TwigBridge\ServiceProvider",它基本上复制了twigbride.php文件;)
    【解决方案2】:

    您可以在 simple.twig 中尝试使用 {% extends 'templates/master.twig' %} 代替 {% extends 'templates.master' %} 吗?

    【讨论】:

    • 这是因为您的模板 (master.twig) 位于比其子文件 (simple.twig) 非常低的文件夹中
    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多