Laravel по-русски

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

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

#1 05.07.2016 15:42:06

Подскажите правильное направление

Здравствуйте.

Изучаю ларавел и не понятно как реализовать правильно следующее:

Есть класс который отвечает скажем за заголовок h1 и тэг title.

Я хочу его вызывать из любого контроллера или блэйд шаблона. Что то типа Titles->set("Привет!"); Внутри данного метода я обрабатываю данные и уже в основном шаблоне делаю Titles->getTitle() ; Titles->getH1();

Подскажите в какую сторону копать что бы правильно реализовать такой функционал. Заплутал я совсем в провайдерах, сервис контроллерах, фасадах и тд...

Заранее спасибо за помощь!

Не в сети

#2 05.07.2016 20:29:19

Re: Подскажите правильное направление

Чтобы у каждой страницы был  свой татйл, можно
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

Не в сети

#3 06.07.2016 14:13:50

Re: Подскажите правильное направление

Мне кажется такой подход не совсем гибкий, тем более что хочу использовать в связке 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()

Подскажите что я делаю не так?

Заранее спасибо за помощь.

Не в сети

#4 06.07.2016 23:16:14

Re: Подскажите правильное направление

А зачем связывание в провайдере использовать?

Не в сети

#5 06.07.2016 23:29:10

Re: Подскажите правильное направление

А нельзя 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)

Не в сети

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