Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 26.03.2015 21:14:39

view()->composer не работает

мне надо сделать отображение меню на всех страницах

app\Providers\AppServiceProvider.php

class AppServiceProvider extends ServiceProvider {
	public function boot()
	{
		view()->composer('modules.mainmenu', 'CategoryController@mainmenu');

	}
}

app\Http\Controllers\CategoryController.php

<?php namespace App\Http\Controllers;

use App\Category;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class CategoryController extends Controller {

	public function mainmenu()  
	{
        $result = Category::descendantsOf(1)->toTree();
	return view('modules.mainmenu')->withTree($result);

	}
}

resources\views\layout\main.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
<body>
@include('modules.mainmenu')
</body>
</html>

resources\views\modules\mainmenu.blade.php

<ul class="nav navbar-nav">
@foreach ($tree as $node)
<li class="dropdown"><a href="{{ $node->sef }}" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">{{ $node->title }} <span class="caret"></span></a>
	<ul class="dropdown-menu" role="menu">
  		@foreach ($node->children as $child)
  		<li><a href="{{ $child->sef }}">{{ $child->title }}</a></li>
		@endforeach
	</ul>
</li>
@endforeach					
</ul>

получаю ошибку
3/3
ErrorException in Container.php line 776:
Class CategoryController does not exist (View: D:\OpenServer\domains\steklo.dev\resources\views\layout\main.blade.php) (View: D:\OpenServer\domains\steklo.dev\resources\views\layout\main.blade.php)


вывод списка меню на отдельной странице при помощи Route::get('categories', 'CategoryController@mainmenu');  нормально работает, но через view()->composer что-то не так

Не в сети

#2 27.03.2015 08:10:23

Re: view()->composer не работает

вьюкомпозер не создаёт вида, он работает с уже созданным, получая его в качестве параметра. и вообще — лучше вьюкомпозеры держать не в контроллерах. это отдельная сущность, которую лучше вынести в свою папку и подключать отдельным сервис провайдером.

например:

а) создаём сервис провайдер app\Providers\ComposerServiceProvider.php:

PHP
<?php namespace App\Providers;

use 
Illuminate\Support\ServiceProvider;

class 
ComposerServiceProvider extends ServiceProvider {

    
/**
     * Register bindings in the container.
     *
     * @return void
     */
    
public function boot()
    {
        
view()->composer('layouts.admin''App\Http\ViewComposers\AdminLayoutComposer');
    }


    
/**
     * Register the service provider.
     *
     * @return void
     */
    
public function register()
    {
    }
}

в этом провайдере мы будем назначать композеры видам.

б) создаём сам композер в app\Http\ViewComposers\AdminLayoutComposer.php:

PHP
<?php namespace App\Http\ViewComposers;

use 
App\Commands\Admin\CollectCounters;
use 
Illuminate\Contracts\View\View;
use 
Illuminate\Foundation\Bus\DispatchesCommands;

class 
AdminLayoutComposer {

    use 
DispatchesCommands;


    
/**
     * Bind data to the view.
     *
     * @param  View $view
     *
     * @return void
     */
    
public function compose($view)
    {
        
$counters $this->dispatch(new CollectCounters);
        
$view->with($counters);
    }
}

в этом примере я использую команду, которой загружаю счётчики количества новых заказов и сообщений для вывода в меню. вообще выносить длинные портянки кода из экшенов в команды — это laravel-way. такие команды можно повторно использовать например для выполнения операций с ком. строки через artisan, их удобно покрывать юнит-тестами.

в) остаётся подключить сервис-провайдер в приложение — открываем config/app.php и в providers добавляем PHP'App\Providers\ComposerServiceProvider'.

Не в сети

#3 27.03.2015 13:25:10

Re: view()->composer не работает

лучше вообще ничего не отвечать, чем писать пургу
у меня вопрос был вообще не об этом

я смог получить результат при помощи непосредственной вставки кода в AppServiceProvider
app\Providers\AppServiceProvider.php

	public function boot()
	{
		view()->composer('modules.mainmenu', function($view)
		{
			$view->withTree(Category::descendantsOf(1)->toTree());
		});

	}

но мне хочется этот код вывести в контроллер
view()->composer('modules.mainmenu', 'CategoryController@mainmenu');

а контроллер никак не хочет опознаваться Class CategoryController does not exist
то есть скорее всего AppServiceProvider не видит контроллер, хотя я добавлял вот это

use App\Http\Controllers\CategoryController;

Не в сети

#4 27.03.2015 16:04:28

Re: view()->composer не работает

  1. лучше вообще ничего не отвечать, чем писать пургу

с одной стороны, знаю ответ, но с другой — пусть лучше тебе его напишет кто-нибудь, кто получает удовольствие, когда ему хамят.

Изменено constb (27.03.2015 16:04:43)

Не в сети

#5 27.03.2015 17:24:01

Re: view()->composer не работает

сиди и получай удовольствие от своей важности - я и сам разберусь
ты и так ответил на другой вопрос и это такое же хамство

Не в сети

#6 28.03.2015 15:52:39

Re: view()->composer не работает

schel4ok пишет:

мне надо сделать отображение меню на всех страницах


Я так понял задача стоит в первом предложении вашего поста.
По-моему, если внимательно проанализировать ответ на ваш пост уважаемого constb, то он на него ответил. Ответа его хватит, чтобы достичь цели по отображению меню на всех страницах сайта.

Я не хочу "писать пургу" так как не являюсь знатоком фреймверка Laravel в достаточной степени, но идею подключать вью композеры сервиспровайдером лично я подчеркнул у Jeffrey Way(laracasts.com). В этом подкасте он подключает меню во всех страницах сайта:

https://laracasts.com/series/laravel-5- … pisodes/25

Я задавался вопросом почему он так делает, но ответ я получил здесь, как не покажется это парадоксальным, - "вьюкомпозер не создаёт вида, он работает с уже созданным, получая его в качестве параметра". И это в первом предложении ответа! Ну а самое ценное - на засоряйте контроллеры, когда есть сервиспровайдеры и комманды!

P.S. Уважаемый constb, всегда найдется тот кто оценит ход ваших мыслей, для меня они гениальны!

Изменено scriptix (28.03.2015 16:01:51)

Не в сети

#7 24.06.2016 10:19:18

Ярослав

Re: view()->composer не работает

Значит ли это, что запускаться запросы к БД из сервис-провайдера композера будут только при вызове конкретных view?
Я к тому, что меня смущает, что Ваш счётчик заказов будет запускаться сплошь и рядом smile А выводиться будет только в необходимых Вам view.
Или я ошибаюсь в этом плане?

#8 24.06.2016 15:34:44

12345

Re: view()->composer не работает

Не смущайтесь, при использование view()->composer() запускается только при обращении к указанной в ней view

#9 23.01.2018 15:13:53

Re: view()->composer не работает

scriptix спасибо за ссылку, очень выручила!

Не в сети

Подвал раздела