soberwp / controller
WordPress 包,用于在使用 Sage 9 与 Blade 一起时启用基本控制器
Requires
- php: >=5.6.0
- brain/hierarchy: ^2.3
- composer/installers: ~1.0
- hassankhan/config: ^0.10.0
- symfony/yaml: ^3.2
Requires (Dev)
This package is auto-updated.
Last update: 2023-07-27 19:42:24 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.php
和 FrontPage.php
。Controller 命名空间变更为 namespace App\Controllers;
需求
- PHP >= 7.0
设置
默认情况下,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('__变量名称作为字符串__')
支持
- 关注 Twitter 上的 @withjacoby
- 请买我一杯啤酒或支付我的租金,paypal.me/darrenjacoby
更新
- 将 composer.json 版本更改为 2.1.2
- 在更新前,请检查 CHANGELOG.md 中的任何重大更改。
$ composer update