Laravel 服务提供商中的访问布局
Laravel Access Layout in service provider
这是我的服务提供商代码:
<?php namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Event;
class LayoutVarsServiceProvider extends ServiceProvider {
public function register()
{
}
public function boot()
{
$route = Route::currentRouteAction();
$parts = explode("@" , $route);
Event::listen('Illuminate\Events\Dispatcher', function($event)
{
if($parts[0] = 'IndexController'){
switch($parts[1]) {
case 'getIndex':
$this->app->layout->container_class = 'homepage';
break;
case 'getHowworks':
$this->app->layout->container_class = 'how-does-it-work';
}
}
});
}
}
我希望能够通过使用 Laravel 事件调度获取我的服务提供商中加载的当前控制器或当前布局 我能够从 Laravel Face 获取控制器名称和 acion 名称Route.but 如何访问布局 ???
我已经知道所有服务提供商都扩展服务提供商和服务提供商 class 有一个 属性 调用的应用程序,这样我们就可以访问 laravel IOC。
已解决。
我的问题都解决了,但是我不知道如何访问已经调度的控制器实例。
而且我已经阅读了容器和控制器以及服务提供商的源代码,这是不可能的。也许我应该自己扩展 laravel 容器。
据我了解,您尝试根据调用的控制器方法更改一些布局变量。
您必须了解服务提供者是为其他目的而创建的。要操作布局变量,最好通过调用 $this->layout 来使用控制器
编写更少的代码并不总是意味着更好的质量。有时最好多写一些东西,以防将来其他人会在这个项目上工作。
另外请不要从其他控制器调用控制器。它创建 shagetti 代码。请改用助手。
由于您根据控制器和调用的函数设置了 class 变量。
IndexController@getIndex - 将布局 class 设置为主页
IndexController@getHowworks - 将布局 class 设置为 how-does-it-work
如果您使用默认设置并扩展 BaseController:
class BaseController extends \Controller {
/**
* Setup the layout used by the controller.
*
* @return void
*/
protected function setupLayout()
{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
}
}
那么在你的控制器中你应该可以这样做:
public function getIndex()
{
$this->layout->container_class = 'homepage';
... rest of controller code
}
public function getHowworks ()
{
$this->layout->container_class = 'how-does-it-work';
... rest of controller code
}
好的,所以基本上将您的配置(示例名称 class.php)定义为
return [
'IndexController@getIndex' => 'homepage',
'IndexController@getHowworks' => 'how-does-it-work'
];
然后你可以在一个单独的文件中创建一个辅助函数,但是因为我们使用的是 Laravel 配置,所以我们不妨将它构建为一个 HTML 宏(你可以在里面做这个您的服务提供商。
HTML::macro('classLookUp', function()
{
$route = Route::current();
return Config::get('class'.$route);
}
那么为了简单地使用它,像这样放入你的 blade 控制器:
<div id="container" class="{{ HTML::classLookUp() }}"></div>
您可能想要更改其中的一些内容,但基本概念已经可以解决您的问题。
这是我的服务提供商代码:
<?php namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Event;
class LayoutVarsServiceProvider extends ServiceProvider {
public function register()
{
}
public function boot()
{
$route = Route::currentRouteAction();
$parts = explode("@" , $route);
Event::listen('Illuminate\Events\Dispatcher', function($event)
{
if($parts[0] = 'IndexController'){
switch($parts[1]) {
case 'getIndex':
$this->app->layout->container_class = 'homepage';
break;
case 'getHowworks':
$this->app->layout->container_class = 'how-does-it-work';
}
}
});
}
}
我希望能够通过使用 Laravel 事件调度获取我的服务提供商中加载的当前控制器或当前布局 我能够从 Laravel Face 获取控制器名称和 acion 名称Route.but 如何访问布局 ??? 我已经知道所有服务提供商都扩展服务提供商和服务提供商 class 有一个 属性 调用的应用程序,这样我们就可以访问 laravel IOC。
已解决。
我的问题都解决了,但是我不知道如何访问已经调度的控制器实例。 而且我已经阅读了容器和控制器以及服务提供商的源代码,这是不可能的。也许我应该自己扩展 laravel 容器。
据我了解,您尝试根据调用的控制器方法更改一些布局变量。 您必须了解服务提供者是为其他目的而创建的。要操作布局变量,最好通过调用 $this->layout 来使用控制器 编写更少的代码并不总是意味着更好的质量。有时最好多写一些东西,以防将来其他人会在这个项目上工作。
另外请不要从其他控制器调用控制器。它创建 shagetti 代码。请改用助手。
由于您根据控制器和调用的函数设置了 class 变量。
IndexController@getIndex - 将布局 class 设置为主页
IndexController@getHowworks - 将布局 class 设置为 how-does-it-work
如果您使用默认设置并扩展 BaseController:
class BaseController extends \Controller {
/**
* Setup the layout used by the controller.
*
* @return void
*/
protected function setupLayout()
{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
}
}
那么在你的控制器中你应该可以这样做:
public function getIndex()
{
$this->layout->container_class = 'homepage';
... rest of controller code
}
public function getHowworks ()
{
$this->layout->container_class = 'how-does-it-work';
... rest of controller code
}
好的,所以基本上将您的配置(示例名称 class.php)定义为
return [
'IndexController@getIndex' => 'homepage',
'IndexController@getHowworks' => 'how-does-it-work'
];
然后你可以在一个单独的文件中创建一个辅助函数,但是因为我们使用的是 Laravel 配置,所以我们不妨将它构建为一个 HTML 宏(你可以在里面做这个您的服务提供商。
HTML::macro('classLookUp', function()
{
$route = Route::current();
return Config::get('class'.$route);
}
那么为了简单地使用它,像这样放入你的 blade 控制器:
<div id="container" class="{{ HTML::classLookUp() }}"></div>
您可能想要更改其中的一些内容,但基本概念已经可以解决您的问题。