soberwp/controller

此包已被废弃,不再维护。未建议替代包。

WordPress 包,用于在使用 Sage 9 与 Blade 一起时启用基本控制器

安装: 2,006,329

依赖者: 19

建议者: 0

安全: 0

星标: 369

关注者: 26

分支: 37

开放问题: 7

类型:package

9.0.0-beta.4 2017-08-22 17:35 UTC

README

WordPress 包,用于在使用 Sage 9 与 Blade 一起时启用控制器(请注意,Sage 10 使用 Composer 而不是此包)


安装

Composer

Sage 随附控制器。但是,如果您需要安装,请浏览到 Sage 主题目录并运行;

$ composer require soberwp/controller:2.1.2

升级到 2.x.x

请注意,2.x.x 版本是比 9.x.x-beta 更新的版本。9.x.x 版本用于匹配 Sage 9 当时的版本。

Controller 2.x.x 使用 PSR4 自动加载 来加载 Controller 类。这被认为是最佳实践。您需要从 9.0.0-beta 版本更新以下文件。

文件夹 controllers/ 变更为 Controllers/,类文件名变更为驼峰式 App.phpFrontPage.php。Controller 命名空间变更为 namespace App\Controllers;

需求

设置

默认情况下,Controller 使用命名空间 Controllers

Controller 优势在于 PSR-4 自动加载。要更改命名空间,请在 functions.php 中使用以下过滤器

add_filter('sober/controller/namespace', function () {
    return 'Data';
});

用法

概述

  • Controller 类名遵循与 WordPress 相同的层次结构。
  • Controller 类名应与文件名匹配
    • 例如 App.php 应定义类为 class App extends Controller
  • 在 Controller 类中创建方法;
    • 使用 public function 将数据返回到 Blade 视图/s
      • 方法名成为 Blade 中的变量名
      • 驼峰式转换为蛇形。在 Controller 中的 public function ExampleForUser 变为在 Blade 模板中的 $example_for_user
      • 如果声明了相同的方法名两次,则最新的实例将覆盖之前的实例
    • 使用 public static function 来从 Blade 模板中运行方法并返回数据。这对于循环非常有用
      • 方法名不会转换为蛇形
      • 您可以使用类名后跟方法来访问方法。在 App.php 中的 public static function Example 可以通过 App::Example() 在 Blade 中运行。
      • 如果声明了相同的方法名两次,则最新的实例将覆盖之前的实例
    • 使用 protected function 用于内部方法。这些方法不会暴露给 Blade。您可以在 __construct 中运行它们。
      • 通过 __construct 可用类型提示的依赖注入。

初读时,这可能会听起来很复杂,所以让我们通过一些示例来看看 Controller 的使用有多么简单。

基本控制器;

以下示例将 $images 暴露给 resources/views/single.blade.php

app/Controllers/Single.php

<?php

namespace App\Controllers;

use Sober\Controller\Controller;

class Single extends Controller
{
    /**
     * Return images from Advanced Custom Fields
     *
     * @return array
     */
    public function images()
    {
        return get_field('images');
    }
}

resources/views/single.blade.php

@if($images)
  <ul>
    @foreach($images as $image)
      <li><img src="{{$image['sizes']['thumbnail']}}" alt="{{$image['alt']}}"></li>
    @endforeach
  </ul>
@endif

使用函数;

您可以使用静态方法在视图中运行一个函数。

如果您在循环中,并且想要为每个帖子项返回数据,这非常有用。

app/Controllers/Archive.php

<?php

namespace App\Controllers;

use Sober\Controller\Controller;

class Archive extends Controller
{
    public static function title()
    {
        return get_post()->post_title;
    }
}

resources/views/archive.php

@extends('layouts.app')

@section('content')

  @while (have_posts()) @php the_post() @endphp
    {{ Archive::title() }}
  @endwhile

@endsection

使用组件;

您还可以创建可重用组件,并使用 PHP 特性将它们包含在任何控制器类中。

app/Controllers/Partials/Images.php

<?php

namespace App\Controllers\Partials;

trait Images
{
    public function images()
    {
        return get_field('images');
    }
}

现在您可以将 Images 特性包含在任何视图中,以传递变量 $images;

app/Controllers/Single.php

<?php

namespace App\Controllers;

use Sober\Controller\Controller;

class Single extends Controller
{
    use Partials\Images;
}

继承树/层次结构;

默认情况下,每个控制器会根据控制器的特定性(与 WordPress 模板相同的方式)覆盖其模板层次结构。

通过实现树,您可以继承层次结构中更不特定的控制器的数据。

例如,以下 app/Controllers/Single.php 示例将继承 app/Controllers/Singular.php 中的方法;

app/Controllers/Single.php

<?php

namespace App\Controllers;

use Sober\Controller\Controller;
use Sober\Controller\Module\Tree;

class Single extends Controller implements Tree
{

}

如果您愿意,您也可以这样做;

<?php

namespace App\Controllers;

use Sober\Controller\Controller;

class Single extends Controller
{
    protected $tree = true;
}

您可以通过在 app/Controllers/Single.php 中声明相同的方法名来覆盖 app/Controllers/Singular.php 中的方法;

创建全局属性;

app/Controllers/App.php 中创建的方法将被所有视图继承,并且不能像 resources/views/layouts/app.php 那样扩展所有视图来禁用。

app/Controllers/App.php

<?php

namespace App\Controllers;

use Sober\Controller\Controller;

class App extends Controller
{
    public function siteName()
    {
        return get_bloginfo('name');
    }
}

高级自定义字段模块;

控制器有一个有用的高级自定义字段辅助模块,可以自动化传递字段。

自动字段将使用高级自定义字段的变量名并将它们传递到视图中。默认情况下,控制器还会传递选项值。

<?php

namespace App\Controllers;

use Sober\Controller\Controller;

class Single extends Controller
{
    // Pass on all fields from Advanced Custom Fields to the view
    protected $acf = true;

    // Pass on only field_1 from Advanced Custom Fields to the view
    protected $acf = 'field_1';

    // Pass on multiple fields from Advanced Custom Fields to the view
    protected $acf = ['field_1', 'field_2'];
}

克隆字段将返回每个字段的值,除非启用了“前缀字段名称”选项,在这种情况下,克隆的字段将返回一个对象,其字段名称由克隆字段给出。

值作为对象返回,但是您可以禁用此功能以保持它们为数组。

add_filter('sober/controller/acf/array', function () {
    return true;
});

模板覆盖选项;

您应该仅在边缘情况下使用覆盖。建议使用 WordPress 层次结构。然而,一个边缘情况是 404 模板。

在您的 Blade 视图中,您会有 404.blade.php,因为它以数字开头。在这种情况下,您可以将您的控制器类重命名为 FourZeroFour.php 并使用参数 $template = '404';

<?php

namespace App\Controllers;

use Sober\Controller\Controller;

class FourZeroFour extends Controller
{
    protected $template = '404';
}

生命周期;

控制器类带有两个生命周期钩子,以提供更多控制。

public function __before()
{
    // runs after this->data is set up, but before the class methods are run
}

public function __after()
{
    // runs after all the class methods have run
}

禁用选项;

protected $active = false;

Blade 调试器;

在您的 Blade 视图中,resources/views,您可以使用以下内容来辅助调试:

  • @debug
  • @dump(__var__)

Blade 编码器;

在您的 Blade 视图中,resources/views,您可以使用以下内容来辅助快速编码:

  • @code
  • @code('__变量名称作为字符串__')

要使用 if 语句包装代码,请使用 @codeif

  • @codeif
  • @codeif('__变量名称作为字符串__')

支持

更新

  • 将 composer.json 版本更改为 2.1.2
  • 在更新前,请检查 CHANGELOG.md 中的任何重大更改。
$ composer update