如何从控制器以外的其他文件调用视图

How to call view from an other file than controller

我正在创建一个 laravel 5.2 包,以下是我的文件:

packages/
-Shreeji/
--Ring/
---composer.json
---src/
----Ring.php
----RingModel.php
----RingServiceProvider
----Views/
-----ringslist.blade.php

composer.json

{
 "name": "shreeji/ring",
 "description": "Simple",
 "license": "MIT",
 "authors": [
     {
         "name": "author",
         "email": "email@gmail.com"
     }
 ],
 "autoload": {
        "psr-4": {
             "Shreeji\Ring\": "src/"
         }
     },
 "minimum-stability": "dev",
 "require": {
     "Illuminate/support": "~5"
 }
}

Ring.php

namespace Shreeji\Ring;

use Illuminate\Http\Response;

Class Ring {

function __construct() {

}

public function get_all()
{
    return view("ring::ringlist");
}

}

RingServiceProvider.php

namespace Shreeji\Ring;

use Illuminate\Support\ServiceProvider;

Class RingServiceProvider extends ServiceProvider
{
public function register()
{
    $this->app->bind('ring', function($app){
        return new Ring;
    });
}

public function boot()
{
    $this->loadViewsFrom(__DIR__ . '/Views', 'ring');
}
}

ringlist.blade.php

<!DOCTYPE html>
<html>

<body>

    <h1>Welcome</h1>

</body>
</html>

app/Http/Controllers 中,我创建了一个这样的测试文件:

Ringcontroller.php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Shreeji\Ring\Ring;

class RingController extends Controller
{

 public function index()
 {
     $ring = New Ring();
     $ring->get_all();
 }
}

当我调用控制器时,浏览器不断加载并系统崩溃。我不知道我是否可以像这样在任何控制器 class 之外使用 view

如果我从 Ring.php 文件中调用 view 有任何错误,请告诉我。

你可以使用像 view composer 这样的东西 Docs

在你的 RingServiceProvider 中注册一个作曲家

use Illuminate\Contracts\View\Factory as ViewFactory;
public function boot(ViewFactory $view)
{
    $view->composer('*', 'App\Http\ViewComposers\SomeComposer');
}

并且在App\Http\ViewComposers\SomeComposer

    use Illuminate\Contracts\View\View;
    public function compose(View $view)
    {
        $view->with('count', '1');
    }

试用它,基本上我使用它在特定视图上共享 $variables 但也许这可以帮助您实现您想要的。

或者您可以 use Illuminate\Contracts\View\View; 加载您需要的视图!

我看到的几个问题:

  1. 您想使用视图,但您的包没有require illuminate/view 包。您需要更新 composer.json 文件以要求 "illuminate/view": "~5".

  2. view() 函数是 Illuminate\Foundation\helpers.php 中包含的辅助方法。除非您只想为此功能依赖整个 Laravel 框架,否则您将需要创建自己的 view() 功能。代码在下面,放在哪里由你决定。

    if (! function_exists('view')) {
        /**
         * Get the evaluated view contents for the given view.
         *
         * @param  string  $view
         * @param  array   $data
         * @param  array   $mergeData
         * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
         */
        function view($view = null, $data = [], $mergeData = [])
        {
            $factory = app(ViewFactory::class);
    
            if (func_num_args() === 0) {
                return $factory;
            }
    
            return $factory->make($view, $data, $mergeData);
        }
    }
    
  3. 一旦你让视图正常工作,你就可以整天创建视图,但如果你不从你的控制器中return任何东西,你将看不到任何东西.确保你 return 来自你的控制器方法。