Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте.
Изучаю ларавел и не понятно как реализовать правильно следующее:
Есть класс который отвечает скажем за заголовок h1 и тэг title.
Я хочу его вызывать из любого контроллера или блэйд шаблона. Что то типа Titles->set("Привет!"); Внутри данного метода я обрабатываю данные и уже в основном шаблоне делаю Titles->getTitle() ; Titles->getH1();
Подскажите в какую сторону копать что бы правильно реализовать такой функционал. Заплутал я совсем в провайдерах, сервис контроллерах, фасадах и тд...
Заранее спасибо за помощь!
Не в сети
Чтобы у каждой страницы был свой татйл, можно
1. на каждой странице указывать его явно. Передавать из контроллера как свойство или "зашивать" тайтл в темплейте (шаблоне). Это плохой вариант
2. Сделать шаблон-лэйаут (blade-template layout) где прописать примерно следующее
<html lang="en">
<head>
@section('head')
<title>@yield('title') - Timers Project</title>
<link rel="stylesheet" href="{{ asset('bootstrap-3.3.6-dist/css/bootstrap.min.css') }}">
<script src="{{ asset('js/jquery-1.11.2.min.js') }}"></script>
@show
Главное здесь - запись @yield('title')
это означает что тайтл можно менять на любой странице\шаблон, к-ая будет наследовать этот лэйаут
Далее, делаем шаблон конкретной страницы, наследуемся от этого лэйаута и указываем тот тайтл, к-ый надо
@extends('layouts.app')
@section('title', 'Work - Single Orders')
Эти 2 строки будут у вас на каждой странице, где вы захотите поменять тайтл
Надеюсь понятно объяснил
Здесь на сайте в документации можно почитать об этом в разделе шаблонов и blade-шаблонов
https://laravel.ru/docs/v5/blade
Не в сети
Мне кажется такой подход не совсем гибкий, тем более что хочу использовать в связке Title и H1, где H1 может содержать HTML тэги, а для Title их нужно вычищать.
Покопавшись в SeoTools на гитхабе пришел к следующей конструкции через сервис провайдера:
PageToolsServiceProvider:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Http\MyLibs\PageTools\Contracts;
use App\Http\MyLibs\PageTools;
class PageToolsServiceProvider extends ServiceProvider{
protected $defer = true;
public function boot(){
}
public function register(){
$this->app->singleton('pagetools', function () {
return new PageTools();
});
$this->app->bind(Contracts\PageTools::class, 'pagetools');
}
public function provides(){
return [
Contracts\PageTools,
'pagetools'
];
}
}
Интерфейс:
<?php
namespace App\Http\MyLibs\PageTools\Contracts;
interface PageTools{
public function setTitle($title);
public function getTitle();
}
Сам класс:
<?php
namespace App\Http\MyLibs\PageTools;
use App\Http\MyLibs\PageTools\Contracts\PageTools as PageToolsContract;
class PageTools implements PageToolsContract{
public $title;
public function __construct(){
}
public function setTitle($title){
$this->title = $title;
}
public function getTitle(){
return $this->title;
}
}
Фасад
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class PageToolsFacade extends Facade{protected static function getFacadeAccessor(){return 'pagetools';}}
Конфиг App
App\Providers\PageToolsServiceProvider::class,
'PageTools' => App\Facades\PageToolsFacade::class,
В итоге я хочу получить возможность в любом месте дергать методы, которые отвечают за отображение страницы. От сео примочек, до подключаемых JS\CSS бибилиотек которые я использую во view, непосредственно в шаблоне.
Ну и есть пара вопросов.
1. В правильном ли я направлении действую?
2. Как только начал в провайдере использовать связывание, вывалилась ошибка. Которую не могу победить:
FatalErrorException in Facade.php line 217: Call to undefined method App\Facades\PageToolsFacade::setTitles()
Подскажите что я делаю не так?
Заранее спасибо за помощь.
Не в сети
А зачем связывание в провайдере использовать?
Не в сети
А нельзя tiltle просто перменной заменить? Что то типа
Метод контроллера, отображающий страницу
public function index()
{
$title = 'Какой-то заголовок';
return view('page', compact('title'));
}
View (master template)
...
<title>
{!! $title !!}
</title>
...
View 'page'
@extends('master')
Изменено Elelas (06.07.2016 23:30:36)
Не в сети
Страницы 1