soberwp/controller
最新稳定版本:9.0.0-beta.4
Composer 安装命令:
composer require soberwp/controller
包简介
WordPress package to enable a basic controller when using Blade with Sage 9
关键字:
README 文档
README
WordPress package to enable a controller when using Blade with Sage 9 (Please note, Sage 10 uses Composers and not this package.)
Installation
Composer:
Sage ships with Controller. However, should you need to install, browse into the Sage theme directory and run;
$ composer require soberwp/controller:2.1.2
Upgrading to 2.x.x:
Please note that versions 2.x.x are newer releases than 9.x.x-beta. The 9 was used to match Sage 9 versioning at the time.
Controller 2.x.x uses PSR4 autoloading to load Controller classes. This is considered best practice. You will need to update the following files from 9.0.0-beta versions.
Folder controllers/ changes to Controllers/, class file names changes to camelcase App.php and FrontPage.php. Controller namespaces changes to namespace App\Controllers;
Requirements:
- PHP >= 7.0
Setup
By default Controller uses namespace Controllers.
Controller takes advantage of PSR-4 autoloading. To change the namespace, use the filter below within functions.php
add_filter('sober/controller/namespace', function () { return 'Data'; });
Usage
Overview:
- Controller class names follow the same hierarchy as WordPress.
- The Controller class name should match the filename
- For example
App.phpshould define class asclass App extends Controller
- For example
- Create methods within the Controller Class;
- Use
public functionto return data to the Blade views/s- The method name becomes the variable name in Blade
- Camel case is converted to snake case.
public function ExampleForUserin the Controller becomes$example_for_userin the Blade template - If the same method name is declared twice, the latest instance will override the previous
- Use
public static functionto use run the method from your Blade template which returns data. This is useful for loops- The method name is not converted to snake case
- You access the method using the class name, followed by the method.
public static function ExampleinApp.phpcan be run in Blade usingApp::Example() - If the same method name is declared twice, the latest instance will override the previous
- Use
protected functionfor internal methods. These will not be exposed to Blade. You can run them within__construct- Dependency injection with type hinting is available through
__construct
- Dependency injection with type hinting is available through
- Use
The above may sound complicated on first read, so let's take a look at some examples to see how simple Controller is to use.
Basic Controller;
The following example will expose $images to 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
Using Functions;
You can use static methods to run a function from within your view.
This is useful if you are within the loop and want to return data for each post item.
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
Using Components;
You can also create reusable components and include them in any Controller class using PHP traits.
app/Controllers/Partials/Images.php
<?php namespace App\Controllers\Partials; trait Images { public function images() { return get_field('images'); } }
You can now include the Images trait into any view to pass on variable $images;
app/Controllers/Single.php
<?php namespace App\Controllers; use Sober\Controller\Controller; class Single extends Controller { use Partials\Images; }
Inheriting the Tree/Hierarchy;
By default, each Controller overrides its template hierarchy depending on the specificity of the Controller (the same way WordPress templates work).
You can inherit the data from less specific Controllers in the hierarchy by implementing the Tree.
For example, the following app/Controllers/Single.php example will inherit methods from 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 { }
If you prefer you can also do this;
<?php namespace App\Controllers; use Sober\Controller\Controller; class Single extends Controller { protected $tree = true; }
You can override a app/Controllers/Singular.php method by declaring the same method name in app/Controllers/Single.php;
Creating Global Properties;
Methods created in app/Controllers/App.php will be inherited by all views and can not be disabled as resources/views/layouts/app.php extends all views.
app/Controllers/App.php
<?php namespace App\Controllers; use Sober\Controller\Controller; class App extends Controller { public function siteName() { return get_bloginfo('name'); } }
Advanced Custom Fields Module;
Controller has an useful Advanced Custom Fields helper module to automate passing on fields.
The automated fields will use the variable names from Advanced Custom Fields and pass them onto the view. Controller also passes on options values by default.
<?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']; }
Clone fields will return the value of each the fields in a separate variable, unless the Prefix Field Names option is enabled in which case the the cloned fields will be returned in an object with the field name given to the clone field.
The values are returned as objects, however you can disable this to keep them as arrays.
add_filter('sober/controller/acf/array', function () { return true; });
Template Override Option;
You should only use overrides in edge-case scenarios. Sticking to the WordPress hierarchy is recommended usage. However, one edge-case is the 404 template.
In your Blade view, you would have 404.blade.php as it begins with a number. In this case, you could rename your Controller class FourZeroFour.php and use parameter $template = '404';
<?php namespace App\Controllers; use Sober\Controller\Controller; class FourZeroFour extends Controller { protected $template = '404'; }
Lifecycles;
Controller Classes come with two lifecycle hooks for greater control.
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 }
Disable Option;
protected $active = false;
Blade Debugger;
In your Blade views, resources/views, you can use the following to assist with debugging;
@debug@dump(__var__)
Blade Coder;
In your Blade views, resources/views, you can use the following to assist with jump-starting coding;
@code@code('__name of variable as string__')
To wrap the code in if statements, use @codeif
@codeif@codeif('__name of variable as string__')
Support
- Follow @withjacoby on Twitter
- Buy me a beer or pay my rent, paypal.me/darrenjacoby
Updates
- Change the composer.json version to 2.1.2
- Check CHANGELOG.md for any breaking changes before updating.
$ composer update
soberwp/controller 适用场景与选型建议
soberwp/controller 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2.17M 次下载、GitHub Stars 达 369, 最近一次更新时间为 2026 年 01 月 04 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「wordpress」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 soberwp/controller 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 soberwp/controller 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 soberwp/controller 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Must-use plugin integrating WordPress with the Upsun platform: environment awareness, router-cache friendliness, safe preview clones, deploy migrations, Site Health checks, and a wp upsun CLI command.
Inertia.js server-side adapter for PHP. Handles full visits, Inertia XHR visits, asset-version 409 handshakes and partial reloads. Framework-agnostic, with transparent WordPress integration.
Adds Cache-Tag HTTP response headers for singular WordPress content and purges Cloudflare by tag when content changes.
AI Chatbot & Helpdesk Agent for WooCommerce. Connects your store to Egentify for AI-powered chat, order tracking, email, and ticketing.
MIDDAG's reference architecture for a WordPress plugin — composes the OSS framework/wordpress/ui libraries end to end.
Assets helper package for the Hybrid Core framework.
统计信息
- 总下载量: 2.17M
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 370
- 点击次数: 20
- 依赖项目数: 18
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-01-04