Etykiety

linux (14) php (14) Laravel (9) mysql (9) Hardware (8) Windows (6) sieci (5) PowerShell (4) software (4) MariaDB (3) apache (3) html (3) Microsoft (2) bezpieczeństwo LAN (2) cygwin (2) Akcesoria (1) CMS (1) Laptop (1) Open Office (1) drupal 7 (1) gpg (1) hosting (1) jquery (1) sieci LAN (1) xml (1) zabezpieczenie sieci LAN (1)

środa, 29 listopada 2017

Laravel od podstaw: kontrolery zasobów

W poprzedniej części szkolenia Laravel od Podstaw, p.t. Modele wyjaśniłem jakie podstawowe funkcje pełnią modele w Laravel, oraz jak mogą one ułatwić pracę z tabelami bazy danych. W niniejszej części przedstawię czytlenikom kontrolery zasobów.

Kontrolery zasobów w Laravel


W pierwszej części szkolenia, p.t. Podstawy Routingu omówiłem najprostsze zasady tworzenia tras. Wstępnie zaprezentowałem możliwość przekierowania żądań do kontrolera zasobów, lecz omówienie tematu kontrolerów odłożyłem na kolejną część szkolenia. Nadszedł czas aby lepiej poznać zasady działania kontrolerów zasobów.

Przekazywanie żądań do wyspecjalizowanego kontrolera zasobów ma kilka ważnych zalet. Po pierwsze każdy utworzony w standardowy sposób kontroler zasobów Laravel umożliwia bezpośrednie odwoływanie się do bardzo potężnych metod, takich jak validate, dispatch, czy middleware, które będą omawiane w kolejnych częściach szkolenia. Po drugie, w przypadku rozbudowanych aplikacji, umieszczanie wszystkich metod w pliku routes/web.php to raczej mało efektywne podejście.

Kontrolery zasobów w praktyce


W poprzedniej części, w której zaprezentowałem modele przedstawiłem sposób tworzenia modeli za pomocą polecenia
php artisan make:model

W celach szkoleniowych wykasujmy teraz poprzednio utworzony model Post i stwórzmy go ponownie, z wiadomych powodów bez opcji –migration, ale tym razem z opcją --controller, z poziomu głównego katalogu naszej szkoleniowej aplikacji:

Tworzenie kontrolera zasobów
Tworzenie kontrolera zasobów

Świetnie! Mamy już nasz pierwszy kontroler zasobów. Kontrolery zasobów znajdują się w katalogu
app/Http/Controllers
Zobaczmy teraz co zawiera nasz kontroler o nadanej mu automatycznie nazwie PostController.php:

Przykładowy kontroler zasobów Laravel
Przykładowy kontroler zasobów Laravel

Następnie dodajmy do niego funkcję przekazującą pozyskane z bazy danych posty do widoku posts/index.blade.php:
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;

class PostController extends Controller
{

 public function index() {

   $posts = Post::all();

   return view('posts.index', compact('posts'));

   /**
    * Alternatywnie i z takim samym efektem
    *
    * return view('posts.index')->with('posts', $posts);
    *
    */

 }

}

?>

Ponieważ za chwilę objaśnię również metodę wyświetlającą treść poszczególnych postów, tak powinien teraz wyglądać nasz plik widoku listy postów resources/views/posts/index.blade.php:
<html lang="pl">

<head>

        <title>Szkoleniowe posty</title>

</head>

<body>
        <h1>Lista postów</h1>

        <ul>
                @foreach($posts as $post)

                        <li><a href="posts/{{ $post->id }}">{{ $post->title }}</a></li>

                @endforeach

        </ul>

</body>

</html>

Aby jednak lista tytułów postów mogła się prawidłowo wyświetlać za pomocą utworzonej funkcji kontrolera po przejściu na względny adres /posty, należy w pliku routes/web.php umieścić przekierowanie do funkcji index() kontrolera postów. Nasz plik routes/web.php powinien więc wyglądać następująco:
<?php

Route::get('/posty', 'PostController@index');

?>

Sprawdźmy teraz czy lista postów, z odnośnikami do treści poszczególnych postów, wyświetla się prawidłowo:

Szkoleniowy widok listy postów z odnośnikami do treści
Szkoleniowy widok listy postów z odnośnikami do treści

Świetnie! Wygląda na to, że wszystko działa, więc dodajmy możliwość wyświetlania treści poszczególnych postów w wyniku kliknięcia w odnośniki do treści.

Do naszego kontrolera PostController dodajmy funkcję o nazwie show(). Jako argument funkcji, w zmiennej $post przekazywany będzie obiekt klasy Post:
public function show(Post $post) {
        return view('posts.show')->with('post', $post);
   }

Do naszego pliku routes/web.php dodajmy trasę prowadzącą do metody show() kontrolera zasobów PostController:
Route::get('/posty/{post}', 'PostController@show');

Następnie stwórzmy widok resources/views/posts/show.blade.php:
<html lang="pl">

        <head>

                <title>Szkoleniowa treść posta</title>

        </head>

        <body>
                <h1>{{$post->title}}</h1>

                <hr>

                <p>{{ $post->body }}</p>

        </body>

</html>

Gotowe! Teraz po wejściu na względny adres /posty i kliknięciu w którykolwiek odnośnik do treści posta, w przeglądarce pojawia się treść wybranego posta, przykładowo:

Nasz szkoleniowy widok treści wybranego posta
Nasz szkoleniowy widok treści wybranego posta


Jak to działa


Laravel jest bardzo potężnym narzędziem programistycznym i wiele - nie tyle ciężkiej ile żmudnej pracy - potrafi wykonać za nas, pod warunkiem pisania kodu zgodnego z pewnymi regułami.

Aby funkcja show() kontrolera PostKontroler działała prawidłowo, należy zwrócić szczególną uwagę aby nazwa zmiennej parametru $post była zgodna z nazwą parametru {post} w funkcji pliku routes/web.php. Całą resztę skojarzeń wykonuje za nas Laravel!

Podsumowanie


W niniejszej części zobaczyliśmy podstawy działania kontrolerów zasobów oraz konkretny przykład przekazywania parametrów do kontrolera. Wiemy już jak pozyskiwać dane z tabeli bazodanowej i potrafimy przekazywać je z kontrolera zasobów do widoku. W kolejnej części pokażę jak zapisywać w tabeli bazy danych wprowadzone do formularza web informacje.

Serdecznie zapraszam do kolejnej części niniejszego szkolenia, p.t Zapis danych z formularza

1 komentarz:

  1. I to są świetne wiadomości, szukałem takiego jasnego opisu już długo. Nie potrzebnie na wielu stronach to utrudniają, tu wszystko ładnie i prosto przedstawiłeś, pozdrawiam.

    OdpowiedzUsuń

Dodaj komentarz