Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
мне надо сделать отображение меню на всех страницах
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 что-то не так
Не в сети
вьюкомпозер не создаёт вида, он работает с уже созданным, получая его в качестве параметра. и вообще — лучше вьюкомпозеры держать не в контроллерах. это отдельная сущность, которую лучше вынести в свою папку и подключать отдельным сервис провайдером.
а) создаём сервис провайдер app\Providers\ComposerServiceProvider.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 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'
.
Не в сети
лучше вообще ничего не отвечать, чем писать пургу
у меня вопрос был вообще не об этом
я смог получить результат при помощи непосредственной вставки кода в 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;
Не в сети
Не в сети
сиди и получай удовольствие от своей важности - я и сам разберусь
ты и так ответил на другой вопрос и это такое же хамство
Не в сети
мне надо сделать отображение меню на всех страницах
Я так понял задача стоит в первом предложении вашего поста.
По-моему, если внимательно проанализировать ответ на ваш пост уважаемого constb, то он на него ответил. Ответа его хватит, чтобы достичь цели по отображению меню на всех страницах сайта.
Я не хочу "писать пургу" так как не являюсь знатоком фреймверка Laravel в достаточной степени, но идею подключать вью композеры сервиспровайдером лично я подчеркнул у Jeffrey Way(laracasts.com). В этом подкасте он подключает меню во всех страницах сайта:
https://laracasts.com/series/laravel-5- … pisodes/25
Я задавался вопросом почему он так делает, но ответ я получил здесь, как не покажется это парадоксальным, - "вьюкомпозер не создаёт вида, он работает с уже созданным, получая его в качестве параметра". И это в первом предложении ответа! Ну а самое ценное - на засоряйте контроллеры, когда есть сервиспровайдеры и комманды!
P.S. Уважаемый constb, всегда найдется тот кто оценит ход ваших мыслей, для меня они гениальны!
Изменено scriptix (28.03.2015 16:01:51)
Не в сети
Значит ли это, что запускаться запросы к БД из сервис-провайдера композера будут только при вызове конкретных view?
Я к тому, что меня смущает, что Ваш счётчик заказов будет запускаться сплошь и рядом А выводиться будет только в необходимых Вам view.
Или я ошибаюсь в этом плане?
Не смущайтесь, при использование view()->composer() запускается только при обращении к указанной в ней view
scriptix спасибо за ссылку, очень выручила!
Не в сети
Страницы 1