Как вызвать представление из другого файла, кроме контроллера

Я создаю пакет 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 protected]"
     }
 ],
 "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();
 }
}

Когда я вызываю контроллер, браузер продолжает загружаться и систематически падает. Я не знаю, могу ли я использовать view вне любого подобного класса контроллера.

Дайте мне знать, если я допустил ошибку при вызове view из файла Ring.php.


person Jay    schedule 19.01.2016    source источник
comment
Ваш контроллер должен что-то вернуть. Это работает, если вы return $ring->get_all();?   -  person patricus    schedule 19.01.2016
comment
Проблема в файле Ring.php при вызове представления   -  person Jay    schedule 19.01.2016


Ответы (2)


Пара проблем, которые я вижу:

  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 будете делать со своего контроллера, вы ничего не увидите. Убедитесь, что вы возвращаете что-то из методов вашего контроллера.

person patricus    schedule 20.01.2016

Вы можете использовать что-то вроде компоновщика представлений 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; загрузить свой вид, который вам нужен!

person Froxz    schedule 19.01.2016