Контроллеры
позволяют вынести код обработчика
роутера в отдельный файл.
Контроллер
решает какой вид использовать и какие
данные запросить у модели. Вместо функции
запрос пользователя обрабатывает
контроллер.
Адрес
контроллеров: \app\Http\Controllers
Имя
файла должно соответствовать имени
будущего класса: FirstController.php
<?php
namespace
App\Http\Controllers;
use
App\Http\Controllers\Controller;
class FirstController
extends Controller {
}
Идем в маршрутизатор:
// после @ идет
название метода-обработчика
Route::get('/about', 'FirstController@show');
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');
В методе 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
{
//
}
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class Core extends Controller
{
//
}
Через
консоль мы можем создать контроллер
в каталоге относительно папки
Controllers
php artisan make:controller Admin\Core
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
{
//
}
Создавая маршруты в качестве обработчиков можно использовать, как различные контроллеры, так один определенный контроллер и определенный метод. Или единственный контроллер с другим методом:
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class Core extends Controller
{
//
}
Создавая маршруты в качестве обработчиков можно использовать, как различные контроллеры, так один определенный контроллер и определенный метод. Или единственный контроллер с другим методом:
Или
так: 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) {
}
}
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']);
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)
{
//
}
}
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');
Route::resource('/pages', 'Admin\CoreResource');
В
контроллере напишем:
public function index()
{
echo __METHOD__;
}
{
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;
}
{
echo $id;
}
Наберем:
http://tlaravel.loc/pages/10
Выводит:
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', ['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__;
}
{
echo __METHOD__;
}
Вызываем:
http://tlaravel.loc/pages/add
Создание единых
контроллеров для обработки маршрутов
Не работает в
5.4!
С
помощью консоли создадим новый контроллер:
php artisan
make:controller PagesController
Создается
контроллер PagesController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PagesController extends Controller
{
//
}
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__;
}
{
// getIndex по умолчанию используется для обращения к запросу, создаваемого маршрутизатора
public function getIndex() {
echo __METHOD__;
}
public
function getCreate() {
echo __METHOD__;
}
public function postIndex() {
print_r($_POST);
}
}
echo __METHOD__;
}
public function postIndex() {
print_r($_POST);
}
}
Имя
для создаваемого маршрута:
Route::controller('/pages','PagesController',
['getCreate' => 'pages.create']);
Комментариев нет:
Отправить комментарий