首页 > 解决方案 > 允许包中的原生 Laravel “魔术”方法

问题描述

我正在尝试创建一个包裹 View 引擎的包,并允许 Magic 方法与 Laravel 自己的方法链接

你好!

我目前正在开发一个主题包,以允许用户轻松动态地切换主题,因此它应该消除用户自己使用 View() 函数的需要,该包将通过包装来处理它周围。

我目前的问题是;我似乎无法弄清楚如何允许这种情况发生,每当我在环绕它的 Theme 函数上执行我习惯用 View() 执行的常规方法链接时,它都不会通过。

我到底应该如何动态地实现常规的“魔术方法”(例如 withErrors 等),而不必手动将此类每种方法添加到 Theme 包的代码中?

这种对我来说似乎很棘手:(

我的 HomeController 示例,尝试使用 With() 链接方法实现所需的方法链接,同样应该可以使用,比如 - withErrors() 或其他任何东西。

我希望本地 Laravel 的 View() 方法支持的每个链式方法都得到我的包的 Make() 方法的支持。

<?php

namespace App\Http\Controllers\Pages;

use.............;

class HomeController extends Controller
{
    /**
     * Show the Homepage.
     *
     * @return \Illuminate\Http\Response
     */
    public function show()
    {
        .............

        return app('theme')->make('pages.home')->with(compact('news'));
    }
}

不允许我链接与 View() 相同的方法,试图找出一种动态支持它的方法。

标签: phplaravellaravel-5

解决方案


如果没有主题包的源代码,就无法真正帮助您,但它看起来像这样:

use Illuminate\Support\Traits\ForwardsCalls;

class Theme
{
    use ForwardsCalls;
    ...
    public function __call($method, $parameters)
    {
        return $this->forwardCallTo($this->getView(), $method, $parameters);
    }
}

你可以对__callStatic


推荐阅读