在 Laravel 5.1 包中使用 Twigbridge
Using Twigbridge in a Laravel 5.1 Package
我正在尝试创建一个 Laravel 5.1 包,它使用 Twigbridge
而不是 .php
视图。我可以获得正常的 .php
视图以正常显示,但是当我尝试使用 .twig
模板时,我只会遇到错误。在为 Laravel 包创建视图时是否可以使用 Twigbridge 模板,或者我们几乎只能使用 blade
和 php
?
编辑 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
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');
}
}
你能在 simple.twig 中尝试使用 {% extends 'templates/master.twig' %}
而不是 {% extends 'templates.master' %}
吗?
很抱歉回答我自己的问题,但我发现答案是引用包。所以 {% extends 'folder.file' %}
变成 {% extends 'packagename::folder/file' %}
.
这成功加载了文件,但它没有回答如何使 {{ form_text() }}
等功能发挥作用。因为我正在使用 rcrowe/twigbridge
有什么方法可以让这些功能正常工作吗?
我正在尝试创建一个 Laravel 5.1 包,它使用 Twigbridge
而不是 .php
视图。我可以获得正常的 .php
视图以正常显示,但是当我尝试使用 .twig
模板时,我只会遇到错误。在为 Laravel 包创建视图时是否可以使用 Twigbridge 模板,或者我们几乎只能使用 blade
和 php
?
编辑 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
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');
}
}
你能在 simple.twig 中尝试使用 {% extends 'templates/master.twig' %}
而不是 {% extends 'templates.master' %}
吗?
很抱歉回答我自己的问题,但我发现答案是引用包。所以 {% extends 'folder.file' %}
变成 {% extends 'packagename::folder/file' %}
.
这成功加载了文件,但它没有回答如何使 {{ form_text() }}
等功能发挥作用。因为我正在使用 rcrowe/twigbridge
有什么方法可以让这些功能正常工作吗?