noadek/twiggy

适用于Laravel的Twig模板引擎实现。允许您在不替换Laravel 5默认blade模板引擎的情况下使用twig

v1.0.0 2016-09-28 12:19 UTC

This package is not auto-updated.

Last update: 2024-09-28 20:03:34 UTC


README

允许您在不替换Laravel 5默认blade模板引擎的情况下使用Twig。基于Edmundas Kondrašovas的Twiggy for CodeIgniter

要求

Twiggy需要Laravel 5。

安装

使用Composer安装此包

composer require noadek/twiggy

快速入门

Composer安装或更新完您的包后,您需要将Twiggy与Laravel本身进行注册。打开config/app.php文件,找到文件末尾的providers键,并添加Twiggy Service Provider到末尾

'providers' => [
     ...
                Twiggy\Provider\TwiggyServiceProvider::class,
],

现在我们将使用Artisan添加新的twig配置文件

php artisan vendor:publish --provider="Twiggy\Provider\TwiggyServiceProvider"

配置

使用php artisan vendor:publish --provider="Twiggy\Provider\TwiggyServiceProvider"命令,您会在config目录下获得一个默认的twiggy.php配置文件。

设置目录结构

Twiggy遵循特定的主题-布局-模板结构,有助于将您的逻辑与视图分离。您可以创建多个主题和布局,并实时切换主题和布局!默认情况下,Twiggy将在服务器根目录的themes文件夹中查找您的twig文件(您可以在config/twiggy.php文件中更改此设置)。因此,您应该创建以下目录和文件。

  1. 创建目录结构

    +-{LARAVELAPP}/
    | +-app/
    ...
    | +-themes/
    | | +-default/
    | | | +-layouts/
    
  2. 创建一个默认布局index.twig并将其放在layouts文件夹中

    <!DOCTYPE html>
    <html lang="en">
    	<head>
    		<meta charset="utf-8">
    		<!--[if lt IE 9]>
    		<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    		<![endif]-->
    		<title>Default layout</title>
    	</head>
        <body>
            {% block content %}
    
            {% endblock %}
    	</body>
    </html>
    
  3. 在default主题文件夹的根目录创建一个默认模板文件index.twig

    {% extends _layout %}
    
    {% block content %}
    
    	Default template file.
    
    {% endblock %}
    
  4. 您的结构最终应该像这样

    +-{LARAVELAPP}/
    | +-themes/
    | | +-default/
    | | | +-layouts/
    | | | | +-index.twig
    | | | +-index.twig
    

用法

至此,您现在可以开始使用twig了。Twiggy基本上为您提供了一些视图或模板设置的辅助函数。

您可以使用twig()辅助函数调用twig模板,就像调用视图一样。

//app/Http/routes.php
//twig template themes/hello.twig
Route::get('/', function () {
    return twig('hello');
});

Twiggy还提供了一些其他有用的辅助函数,用于构建视图的主题-布局-模板结构。

设置主题

默认twiggy主题是'default'。这可以在config/twiggy.php文件中更改。要创建一个新的主题,在themes文件夹中添加一个带有所需主题名称的新文件夹。

实时设置主题

<?php
...

    setTheme('default');

'default'可以更改为您创建的任何其他主题。如果您想构建一个类似于CMS的系统,这可以被操作来自数据库,以便系统的用户可以更改主题。

设置布局

不同的页面可能需要不同的布局,这取决于您的应用程序的结构和设计。Twiggy允许您像您想要的设置和切换布局。请看下面的例子

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PagesController extends Controller
{
    public function __construct()
    {
        setTheme('default');
        setLayout('index');
    }

    public function index()
    {
        $name = 'I am Twiggy';

		return twig('index', compact('name'));
    }

    public function test()
    {
        setLayout('blog');

        return twig('post');
    }
}

在这个例子中,首页将使用'default'主题和'index'布局来显示'index'模板。另一方面,测试页面将使用'default'主题,但使用'blog'布局来显示'post'模板。

设置页面标题

Twiggy提供了三个函数来构建页面标题。根据您的SEO技术,可以使用这些函数。'setPageTitle'函数设置页面的标题,'appendPageTitle'在设置的标题后添加指定的字符串,而'prependPageTitle'在设置的标题前添加指定的字符串。

无论是'appendPageTitle'还是'prependPageTitle',都会使用config/twiggy.php文件中的'stitle_separator'来分隔标题。

让我们为之前的例子添加一个页面标题。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PagesController extends Controller
{
    public function __construct()
    {
        setTheme('default');
        setLayout('index');
        setPageTitle('Pages');
    }

    public function index()
    {
        appendPageTitle('About Me');

        $name = 'I am Twiggy';

		return twig('index', compact('name'));
    }
    ...
}

为此,将index.twig布局文件中的<title>Default layout</title>替换为<title>{{ title }}</title>

在此,索引页面将显示标题“页面 | 关于我”。这也可以通过

    setPageTitle('Pages', 'About Me');

设置页面元数据

来实现。

Twiggy提供了一个名为'setPageMeta'的函数,用于设置动态元标签。这可以用于设置Facebook、Twitter等的Open Graph标记。它还可以用于设置Google站点验证元标签和其他动态元标签。

让我们用元标签更新我们的示例

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PagesController extends Controller
{
    public function __construct()
    {
        setTheme('default');
        setLayout('index');
        setPageTitle('Pages');
    }

    public function index()
    {
        appendPageTitle('About Me');
        setMetatag('description', 'This is all you need to know about twiggy');
        setMetatag('og:url', url('images/me.jpg'), 'property');

        $name = 'I am Twiggy';

		return twig('index', compact('name'));
    }
    ...
}

要使此功能正常工作,我们必须将{{ meta }}变量添加到布局中

    ...
    <head>
        <meta charset="utf-8">
        {{ meta }}
    ...
    </head>

注册函数和过滤器

Twig是沙箱化的。默认情况下,您不能直接使用任何PHP函数,您不能访问给定上下文之外的内容,您也不能在模板中使用纯PHP。这是出于设计考虑,它强制您将业务逻辑与模板分离。

然而,您可以通过在config/twiggy.php文件中分别添加到'register_functions'和'register_filter'数组中所需函数和过滤器,来指定在模板中允许使用的一组PHP函数/过滤器,如下所示:

"register_functions" => [
    'date',
    'phpversion',
    'foo'
],

这告诉Twiggy注册'日期'、'phpversion'和一个名为'foo'的自定义函数。

创建自定义函数

在Laravel中,可以通过多种方式创建自定义函数或过滤器。您总是可以找到更干净的方法来做这件事,但这里是一种使用ServiceProvider的方法:

class AppServiceProvider extends ServiceProvider
{
	protected $defer = true;

	public function boot()
	{
		$this->registerHelper();
	}

	private function registerHelper()
	{
		require app_path(Lib/helpers.php');
	}
}

创建包含您自定义函数和过滤器的辅助文件。

+-{APPPATH}/
| +-Lib/
| | +-helpers.php

最后,将服务提供商添加到config/app.php文件中。