如何从控制器以外的其他文件调用视图
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;
加载您需要的视图!
我看到的几个问题:
您想使用视图,但您的包没有require
illuminate/view
包。您需要更新 composer.json
文件以要求 "illuminate/view": "~5"
.
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);
}
}
一旦你让视图正常工作,你就可以整天创建视图,但如果你不从你的控制器中return
任何东西,你将看不到任何东西.确保你 return 来自你的控制器方法。
我正在创建一个 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;
加载您需要的视图!
我看到的几个问题:
您想使用视图,但您的包没有
require
illuminate/view
包。您需要更新composer.json
文件以要求"illuminate/view": "~5"
.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); } }
一旦你让视图正常工作,你就可以整天创建视图,但如果你不从你的控制器中
return
任何东西,你将看不到任何东西.确保你 return 来自你的控制器方法。