четверг, 29 июня 2017 г.

LARAVEL. КОНТРОЛЛЕРЫ

Контроллеры позволяют вынести код обработчика роутера в отдельный файл.
Контроллер решает какой вид использовать и какие данные запросить у модели. Вместо функции запрос пользователя обрабатывает контроллер.
Адрес контроллеров: \app\Http\Controllers
Имя файла должно соответствовать имени будущего класса: FirstController.php

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;

class FirstController extends Controller {
}

Идем в маршрутизатор:
// после @ идет название метода-обработчика
Route::get('/about', 'FirstController@show');

Идем в FirstController.php:
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;


class FirstController extends Controller {
public function show() {
echo __METHOD__; // App\Http\Controllers\FirstController::show
}
}

Если контроллер определяеся во вложенной папке относительно каталога Controllers, например, Dir. В нем сформируем FirstController.php
namespace App\Http\Controllers\Dir;

А в маршрутизаторе, мы должны указать папку:
Route::get('/about', 'Dir\FirstController@show');

Передадим параметры маршрутов
Route::get('/about/{id}', 'FirstController@show');

В методе show укажем:
public function show($id) {
echo $id;
}

Наберем: http://tlaravel.loc/about/10
Получим: 10

Создадим контроллер с помощью командной строки:
cd domains/tlaravel.loc
php artisan make:controller Core

Файл Core.php:
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class Core extends Controller
{
//
}

Через консоль мы можем создать контроллер в каталоге относительно папки Controllers
php artisan make:controller Admin\Core

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class Core extends Controller
{
//
}
Создавая маршруты в качестве обработчиков можно использовать, как различные
контроллеры, так один определенный контроллер и определенный метод. Или единственный контроллер с другим методом:
Route::get('/pages', 'FirstController@getPages');

Или так: Route::get('/articles', 'Admin\Core@getArticles');

Route::get('/article/{id}', 'Admin\Core@getArticle');

Формируем методы для обработки в Controllers\Admin\Core.php:
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class Core extends Controller
{
// Возвращает список материалов:
public function getArticles() {

}

// Возвращает один материал:
public function getArticle($id) {

}
}

Формируя маршруты, необходимо их именовать.
// Именование маршрутов:
Route::get('/articles', ['uses' => 'Admin\Core@getArticles', 'as' => 'articles']);
Route::get('/article/{id}', ['uses' => 'Admin\Core@getArticle', 'as' => 'article']);

Формирование контроллера типа ресурс
Эти контроллеры используются для построения Restfull-систем.

В консоли напишем: php artisan make:controller Admin\CoreResource --resource

Создается контроллер следующего вида, который включает методы для Restfull-приложения:
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class CoreResource extends Controller
{

public function index()
{
//
}


public function create()
{
//
}

public function store(Request $request)
{
//
}


public function show($id)
{
//
}


public function edit($id)
{
//
}


public function update(Request $request, $id)
{
//
}


public function destroy($id)
{
//
}
}

Создадим маршрутизатор для этого контроллера:
// Маршрутизатор для ресурс-контроллера
Route::resource('/pages', 'Admin\CoreResource');

В контроллере напишем:
public function index()
{
echo __METHOD__;
}

При обращении к странице: http://tlaravel.loc/pages
Выводит: App\Http\Controllers\Admin\CoreResource::index

При обращении по адресу: http://tlaravel.loc/pages/create
отработает метод create(), который используется для добавления элемента. Только для добавления страницы с формой, но не для сохранения!

Метод store(Request $request) сохраняет новый элемент в БД.

Метод show($id) обычно используется для отображения конкретного элемента на экран.
public function show($id)
{
echo $id;
}

Выводит: 10.

Если мы наберем: http://tlaravel.loc/pages/10/edit
То попадем на страницу редактирования элемента, т.е отработает метод edit().
Этот метод должен отобразить поля формы, в которых добавлена предыдущая информация по редактированному элементу.

Метод update(Request $request, $id) используется для сохранения информации в БД. При этом выполняется запрос типа PUT.

Метод destroy($id) удаляет данные из БД.

Методы, которые не используются в функционале можно исключить из создаваемых маршрутов.
// only указывает список методов, для которых будут формироваться маршруты.
Route::resource('/pages', 'Admin\CoreResource', ['only' => ['index', 'show']]);

То есть мы можем обращаться только к данным страницам:

Route::resource('/pages', 'Admin\CoreResource', ['except' => ['index', 'show']]);
Мы можем создать ячейку except, которая наоборот исключает методы из маршрута.

Если нам нужно добавить собственный метод в маршрут, то перед формированием маршрута для ресурс-контроллера формируем свой маршрут:

Route::get('pages/add', 'Admin\CoreResource@add');
Route::resource('/pages', 'Admin\CoreResource', ['except' => ['index', 'show']]);

А в контроллере формируем свой метод:
public function add()
{
echo __METHOD__;
}

Создание единых контроллеров для обработки маршрутов
Не работает в 5.4!
С помощью консоли создадим новый контроллер:
php artisan make:controller PagesController

Создается контроллер PagesController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PagesController extends Controller
{
//
}

Формируем для него маршрут:
Route::controller('/pages', 'PagesController');

В контроллере:
class PagesController extends Controller
{
// getIndex по умолчанию используется для обращения к запросу, создаваемого маршрутизатора
public function getIndex() {
echo __METHOD__;
}
public function getCreate() {
echo __METHOD__;
}

public function postIndex() {
print_r($_POST);
}
}

Имя для создаваемого маршрута:

Route::controller('/pages','PagesController', ['getCreate' => 'pages.create']);

Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html