Dołącz do zespołu ekspertów! Backend lub Frontend Developer?

Sprawdź najnowsze oferty pracy naszego partnera - 8lines.io!

(Laravel 5.6) Kontroler w layoucie?

PHP  Założony przez  Kacper Wojciechowski.

Witam, nie mam pomysłu w jaki sposób wstrzyknąć kontroler do layoutu aplikacji, mianowicie mam taki kontroler:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;

class ReviewsController extends Controller
{
   public function index()
   {
       $reviews = DB::table('reviews')->get();

       return view('global.reviews', ['reviews' => $reviews]);
   }
}
blade:

@isset($reviews)
<div class="user-slider">
   <div class="container">
       <div class="slider owl-carousel owl-theme">
        @foreach ($reviews as $review)
           <div class="item">
               <div class="inside">
                   <img src="{{ asset('assets/images/icon.svg') }}" class="icon" alt="icon">
                   <img src="{{ asset('assets/images/reviews/{{$review->name}}.png') }}" alt="logo-{{ $review->name }}">
                   <p>{{ $review->text }}</p>
                   <div class="user">
                       <a href="{{ $review->domain }}">
                           <img src="{{ asset('assets/images/reviews/{{$review->name}}_av.png') }}" alt="user">
                           {{ $review->author }}
                           <span>{{ $review->author_spec }}</span>
                       </a>
                   </div>
               </div>
           </div>
           @endforeach
       </div>
   </div>
</div>
@endisset
przykladowe uzycie layoutu:
route:
Route::view('/', 'default');
default blade:
@extends('global.globalTemplate')

@section('content')
  kodzik od podstronki
@endsection
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
   <meta charset="utf-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="csrf-token" content="{{ csrf_token() }}">
   <title>{{ config('app.name', 'Laravel') }}</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.5">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/lib/bootstrap.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/lib/font-awesome.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/lib/owl.carousel.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/lib/animations.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/style.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/responsive.css') }}">
</head>
<body>
<div class="wrapper">
@yield('content')
</div>
//tu potrzebuje wstrzyknąć pozywzszy kontroler
<script src="{{ asset('assets/js/lib/jquery.js') }}"></script>
<script src="{{ asset('assets/js/lib/bootstrap.min.js') }}"></script>
<script src="{{ asset('assets/js/lib/owl.carousel.min.js') }}"></script>
<script src="{{ asset('assets/js/lib/css3-animate-it.js') }}"></script>
<script src="{{ asset('assets/js/lib/counter.js') }}"></script>
<script src="{{ asset('assets/js/main.js') }}"></script>
</body>
</html>


Mam nadzieję że wytłumaczyłem o co mi chodzi, z góry dziękuję za pomoc.
Wstrzyknąć tzn? W routes/web.php dodajesz
Route::get('/''ReviewsController@index'); 
No tak, ale jak mam więcej routingów to muszę do każdego tak dodawać? Nie ma jakiejś prostszej metody?
Nie bardzo rozumiem problem?
Kontrolera nie "wstrzykujesz". Najsensowniej by było gdybyś przejrzał dokumentację widoków i routingu, jest to dość solidnie opisane na przykładach.

Każda podstrona powinna się składać z:
  • akcji w kontrolerze
  • templatki
  • ścieżki (route)
Z tego co napisałeś, rozumiem, że chcesz korzystać ze zmiennej $reviews z layoucie (który potem będziesz używał w konkretnych podstronach)? Jeśli tak, to jedną z opcji jest skorzystanie z view composerów:

https://laravel.com/docs/5.6/views#view-composers
https://stackoverflow.com/questions/4407...yout-views
"Try not. Do... or do not. There is no try."
Poświęć 5 minut. Nie bądź ignorantem!  -  Jak zbadać element?
(16.08.2018, 13:03)ficus napisał(a): Nie bardzo rozumiem problem?
Kontrolera nie "wstrzykujesz". Najsensowniej by było gdybyś przejrzał dokumentację widoków i routingu, jest to dość solidnie opisane na przykładach.

Każda podstrona powinna się składać z:
  • akcji w kontrolerze
  • templatki
  • ścieżki (route)
Z tego co napisałeś, rozumiem, że chcesz korzystać ze zmiennej $reviews z layoucie (który potem będziesz używał w konkretnych podstronach)? Jeśli tak, to jedną z opcji jest skorzystanie z view composerów:

https://laravel.com/docs/5.6/views#view-composers
https://stackoverflow.com/questions/4407...yout-views
Chcę w globalTemplate.blade.php includować z ReviewsController@index już wykonany kod w postaci HTML
Czyli to co napisałem. Zrób ReviewComposer w którym przetworzysz dane, które obecnie przetwarzasz w ReviewsController@index.

A w layoucie albo wrzuć kod html z Twojej templatki reviews albo załącz ją jeśli chcesz ją trzymać w osobnym pliku - @include('nazwa templatki').
"Try not. Do... or do not. There is no try."
Poświęć 5 minut. Nie bądź ignorantem!  -  Jak zbadać element?
ComposerServiceProvider.php powinien być w /app/Providers? Dodałem do config/app.php do tablicy providers taką linijkę: Illuminate\View\ComposerServiceProvider::class, i mam błąd Class 'Illuminate\View\ComposerServiceProvider' not found Zawartość ComposerServiceProvider.php:
<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        View::composer('*', 'App\Http\ViewComposers\ReviewComposer');
    }
}
(16.08.2018, 15:31)Kacper Wojciechowski napisał(a): /app/Providers
(16.08.2018, 15:31)Kacper Wojciechowski napisał(a): Illuminate\View\ComposerServiceProvider::class
(16.08.2018, 15:31)Kacper Wojciechowski napisał(a): Class 'Illuminate\View\ComposerServiceProvider' not found
(16.08.2018, 15:31)Kacper Wojciechowski napisał(a): <?php

namespace App\Providers;
W skrócie - dodałeś "ścieżkę" do czegoś co nie istnieje ::)
Skoro namespace Twojej klasy to App\Providers, to powinieneś dodać:
App\Providers\ComposerServiceProvider::class

Do pisania kodu przydatne jest IDE typu PHPStorm lub jakieś sensowne wtyczki (o ile są, nie wiem) do VSC - unikniesz problemu z myleniem namespaceów.
"Try not. Do... or do not. There is no try."
Poświęć 5 minut. Nie bądź ignorantem!  -  Jak zbadać element?
(16.08.2018, 16:02)ficus napisał(a):
(16.08.2018, 15:31)Kacper Wojciechowski napisał(a): /app/Providers
(16.08.2018, 15:31)Kacper Wojciechowski napisał(a): Illuminate\View\ComposerServiceProvider::class
(16.08.2018, 15:31)Kacper Wojciechowski napisał(a): Class 'Illuminate\View\ComposerServiceProvider' not found
(16.08.2018, 15:31)Kacper Wojciechowski napisał(a): <?php

namespace App\Providers;
W skrócie - dodałeś "ścieżkę" do czegoś co nie istnieje ::)
Skoro namespace Twojej klasy to App\Providers, to powinieneś dodać:
App\Providers\ComposerServiceProvider::class

Do pisania kodu przydatne jest IDE typu PHPStorm lub jakieś sensowne wtyczki (o ile są, nie wiem) do VSC - unikniesz problemu z myleniem namespaceów.
Wielkie dzięki, rozejrzę się za tym. Jeszcze mam szybkie pytanie, w jakiej formie do {{ asset() }} mogę dodać {{$review->name}}? {{ asset('assets/images/reviews/{{$review->name}}.png') }} nie wychodzi bo jest konflikt z klamerkami a w dokumentacji nie mogę za bardzo znaleźć jak to użyć
Generalnie Blade to składnia praktycznie taka jak w php więc możliwe że tak
{{ asset('assets/images/reviews/' . $review->name . '.png') }



Użytkownicy przeglądający ten wątek:

1 gości