Laravel. Роуты. Быстрое вхождение.

screenshot-laravel com 2016-03-28 10-36-38 Продолжаю свои экзерсисы с Laravel.

Сначала была идея изучать его просто по документации. Но эта идея быстро прошла, ибо читая документацию придётся слишком долго добираться до конкретной реализации. А без реализации, сложно закрепить навыки. Поэтому нужно просто быстро начать, не сильно разбираясь в деталях.

Написанное ниже суть конспект с ларакаста. Предполагается, что вы уже установили Laravel и выполнили базовую настройку. Везде далее, пути файлов предполагаются относительно папки вашего проекта.

Простейшие роуты
————————————
Роуты, с которыми мы будем работать, расположены в файле /routes/web.php.

Небольшое отступление:

  • В этой папке есть ещё пара файлов. Нужный нам отвечает за роуты именно middleware «web». А ещё есть middleware «api» и Closure based console. Просто, чтобы знать. Не спрашивайте меня, что это такое.
  • Для меня, как разработчика Kohana, бросается в глаза, что файл роутов находится за пределами папки приложения. И вообще, похоже, тут вся папка проекта — одно приложение, один сайт.
    А вот в Kohana было можно в одной инсталляции фреймворка делать несколько разных приложений, выносить часть кода в модули, которые потом использовать разными приложениями в одной инсталляции. Одни и те же физические файлы могли быть использованы разными сайтами.
    Тут похоже другая философия.

В изначальном виде роуты выглядят так:

Route::get('/', function () {
    return view('welcome');
});

Этот код содержит

  • Вызов функции Route::get.
    Кстати, в природе есть ещё функции Route::post и т.д. Видимо для разных методов тут надо создавать разные роуты. Даже если используется один URI
  • Собственно URI. В нашем случае это корень ‘/’
  • Анонимная функция, которая возвращает view под названием welcome

Вместо вьюса можно возвращать просто строку

Route::get('/about', function () {
    return "About us";
});
Route::get('/contacts', function () {
    return "Contact us";
});

Для того, чтобы описать все роуты на ранней стадии разработки, очень даже удобно!

Немного о вьюшках (views)
—————————————-
Тот самый вид welcome, который используется в дефолтном примере расположен в файле /resources/views/welcome.blade.php. И вообще все вьюшки хранятся в этой папке.

По сути там можно хранить просто HTML файл, создать статические роуты, и вот мы уже умеем делать статические сайты с использованием Laravel! Правда это всё равно что палить из пушки по воробьям, но на то оно и быстрое вхождение!

Чтобы сделать страницу динамической ей надо передавать какие-нибудь данные.

В роутах пишем:

Route::get('/contacts', function () {
	$persons = array('Иванов','Петров','Сидоров');
	$phone = "1(234)567890";
	return view('contacts', array('persons' => $persons, 'phone' =>$phone));
});

Ну или используя новый синтаксис PHP

Route::get('/contacts', function () {
	$persons = ['Иванов','Петров','Сидоров'];
	$phone = "1(234)5678901";
	return view('contacts', ['persons' => $persons, 'phone' =>$phone]);
});

Или с использованием функции compact

Route::get('/contacts', function () {
	$persons = ['Иванов','Петров','Сидоров'];
	$phone = "1(234)5678901";
	return view('contacts', compact('persons', 'phone'));
});

Все эти способы абсолютно равнозначны, но последний немного компактнее, поэтому я буду использовать его.

Теперь создадим файл шаблона /resources/views/welcome.blade.php

<p>Phone {{$phone}}</p>
<ul>
	@foreach($persons as $person)
	<li>{{$person}}</li>
	@endforeach
</ul>

Laravel использует Blade в качестве шаблонизатора (Template engine). Шаблонизатор Blade ещё требует изучения, но этот конкретный пример очень даже прост и понятен любому, кто работал с PHP.

И всё! Работает!
screenshot-laratest-2016-12-14-19-11-03

Контроллеры
—————————-
Сначала давайте исправим роут

Route::get('/contacts', 'ContactsController@home' );

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

Создадим контроллер. Можно зайти в папку /app/Http/Controllers и создать соответствующий файл. Но проще использовать artisan.

$ php artisan make:controller ContactsController
Controller created successfully.

И он сам создаст в нужном месте файл ContactsController.php, который будет представлять собой пустой контролер:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ContactsController extends Controller
{
    //
}

В общем… делать это вручную или с помощью утилиты — большой разницы нет. Результат один и тот же.

Дальше в наш класс контроллера добавим метод который так и называется

public function home(){
	$persons = ['Иванов','Петров','Сидоров'];
	$phone = "1(234)56789013";
	return view('contacts', compact('persons', 'phone'));			
}

И перенесём туда тот код, который мы до этого писали в роутах.
Всё работает, но теперь работает более правильнее =)