Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravel 4: простота во всем. Евгений Косинский

fwdays
November 18, 2014

Laravel 4: простота во всем. Евгений Косинский

fwdays

November 18, 2014
Tweet

More Decks by fwdays

Other Decks in Programming

Transcript

  1. Как выглядит разработка сегодня  Выбирается framework (или это может

    быть требования от заказчика)  Требования от заказчика транслируются в бизнес-логику  Profit!
  2. Laravel 4: установка composer create-project laravel/laravel your-project-name --prefer-dist composer global

    require "laravel/installer=~1.1" laravel new PROJECT-NAME Используем composer для установки Используем Laravel installer
  3. Laravel 4: некоторые особенности • Гибкий роутинг • DI/IoC •

    События • Поддержка нескольких видов кеширования • Работа с очередями • Авторизация • Мощная ORM на базе ActiveRecord • Консольная утилита • Тесты
  4. Laravel 4: Routing Route::get(‘/’, function () { echo “Hello world!”;

    }); Route::get(‘/data’, ‘DataController’); Route::post(‘/data’, ‘DataController@storeData’); Route::model('user', 'User', function () { throw new UserNotFoundException(); }); Route::get(‘/user/{user}’, function (User $user) { }); Route::resource(‘/object’, ‘ControllerName’); Замыкание Контроллер RESTful контроллер Привязка модели
  5. Laravel 4: Routing Route::group(array(‘before’ => ‘auth’), function() { Route::get('/settings', function()

    { // }); }); Route::filter(‘auth’, function() { if(Auth::guest()) { return Redirect::to(‘/login’); } });
  6. Laravel 4: Controllers use App\Models\UserService; class HomeController extends Controller {

    private $userService; public function __construct(UserService $userService) { $this->userService = $userService; } public function index() { $currentUser = $this->userService->getUser(); return View::make('index'); } }
  7. Laravel 4: шаблонизатор • реализация шаблонов используя PHP. Файл с

    шаблоном должен иметь расширение *.php • реализация шаблонов используя встроенный шаблонизаторе Blade. Файл с шаблоном должен иметь формат: *.blade.php
  8. Laravel 4: шаблонизатор Возможности шаблонизатора blade • создание шаблонов, состоящие

    из слоев • вывод данных • IF statements, циклы • подключение других представлений
  9. Laravel 4: формы {{ Form::open(‘url’ => ‘/login’, ‘method’ => ‘post’)

    }} {{ Form::open(‘action’=>‘AuthController@login’, ‘method’ => ‘post’) }} {{ Form::open(‘route’ => ‘route.login’, ‘method’ => ‘post’) }} {{ Form::close() }} {{ Form::model($user, array(‘user.update’ => $user->id)) }} {{ Form::close() }} • Form::label • Form::text • Form::password • Form::email • Form::file • Form::checkbox • Form::selectRange • Form::radio • Form::number • Form::select • Form::submit • Form::macro
  10. Laravel 4: валидация данных $validator = Validator::make($input, $rules, $messages); $validator

    = Validator::make( array('name' => 'Test'), array('name' => 'required|min:5'), array('name.min' => 'My own message') ); $validator->fails(); $validator->passes(); $validator->messages()->all(); $validator->messages()->all('<p>:message</p>'); $validator->messages()->has('name');
  11. Laravel 4: база данных MySQL SQLite MSSQL PostgreSQL DB connection

    DB connection Eloquent Query Builder Application code
  12. Laravel 4: Query Builder • where • orWhere • whereBetween

    • whereNotBetween • whereIn • whereNotIn • whereExists • whereNull • orderBy • groupBy • distinct • having • skip • take • first • get • count • max • min • avg • sum • lists • pluck
  13. Laravel 4: Query Builder // SELECT * FROM users WHERE

    (role=1 or role=3) AND status=1; DB::table(‘users’)->where(function ($query){ $query->where(‘role’, ‘=’, 1)->orWhere(‘role’, ‘=’, 3); })->where(‘status’, ‘=’, 1)->get(); // SELECT name, email FROM users; DB::table(‘users’)->select(’name’,’email’)->get(); DB::table(‘users’)->select(DB::raw(“name, email”))->get(); // INSERT INTO users (email, name) VALUES ('[email protected]','John'), ('[email protected]','Gary') DB::table(‘users’)->insert(array( array(‘email’=>’[email protected]’, ‘name‘=>’John’) array(‘email’=>’[email protected]’, ‘name‘=>’Gary’) )); // UPDATE users SET name=’Lary’ WHERE id=1 DB::table(‘users’)->where(‘id’, ‘=’, 1)->update(array(‘name’=>’Lary’)); DB::table(‘users’)->where(‘id’, ‘=’, 1)->increment(‘visits’, 1); DB::table(‘users’)->where(‘id’, ‘=’, 1)->decrement(‘visits’, 1);
  14. Laravel 4: Query Builder // SELECT * FROM users JOIN

    services ON services.userId = users.id WHERE users.id = 1 DB::table(‘users’)->join(‘services’, ‘services.userId’, ‘=’, ‘users.id’)->where(‘users.id’, ‘=’, 1)->get(); // SELECT * FROM users JOIN services ON services.userId = users.id OR services.parentid = users.id WHERE users.id = 1 DB::table(‘users’)->join(‘services’, function($join) { $join->on(...)->orOn(...); })->where(‘users.id’, ‘=’, 1)->get();
  15. Laravel 4: ORM class Users extends Eloquent { protected $table

    = “app_users”; public $timestamps = false; protected $fillable = array(); protected $guarded = array(); public function role() { return $this->hasOne(‘Role’, ‘id’, ‘profileId’); } public function posts() { return $this->hasMany(‘Posts’, ‘userId’); } }
  16. Laravel 4: CLI • Запуск веб сервера для разработки •

    Работа с БД - миграция • Вывод список всех определенных роутов • Просмотр логов • Создание контроллеров • Создание консольных команд • Работа с очередями
  17. Laravel 4: CLI • Вывод строк, выделенных цветом • Запрос

    ввода данных с консоли • Передача аргументов при запуске команды • Вызов другой команды
  18. Laravel 4: события // controller method public function createNewUser($email, $pass)

    { $user = User::create(array(‘email’ => $email, ‘password’ => $pass)); Event::fire(‘user.create’, array($user)); } … // app/start/global.php Event::listen(‘user.create’, function ($user) { // send notification email // added some bonuses // register user for the newsletter });
  19. Laravel 4: очереди Queue::push('MessageHandler', array('data' => $data), 'queue_name'); Queue::push('MessageHandler@send', array('data'

    => $data)); Queue::later(20,'MessageHandler', array('data' => $data)); class MessageHandler { public function fire($job, $data) { } public function send($job, $data) { } } • Sync • Beanstalkd • Amazon SQS • IronMq • Redis
  20. Laravel 4: IoC App::bind(‘UserService’, function () { return new AppUserService();

    }); App::singleton(‘UserService’, function () { return new AppUserService(); }); $userService = App::make(‘UserService’);
  21. Laravel 4: IoC class ClassA { private $classB; public function

    __construct(ClassB $classB) { $this->classB = $classB; } } class ClassB { } $classA = App::make(‘classA’);
  22. Laravel 4 • Реализовать форму добавления товара • Добавить роут

    для обработки • Провести валидацию данных перед сохранением в базу • Сохранить нового товар
  23. Laravel 4 <?php include(‘header.php’);?> <form action=”/item/add” method=”post”> <div class=”form-group”> <label

    class=”col-sm-3 control-label”>Name</label> <div class=”col-sm-4”> <input type=”text” name=”item_name”/> </div> </div> <div class=”form-group”> <label class=”col-sm-3 control-label”>Cost</label> <div class=”col-sm-4”> < input type=”text” name=”item_cost”/> </div> </div> </form> <?php include(‘footer’); ?>
  24. Laravel 4 <!DOCTYPE html> <html> <head> <title>{{ trans('config::menu.title') }}</title> <script

    data-main="/js/main" src="/js/require.js"></script> <link href="/css/bootstrap.min.css" rel="stylesheet"> @yield('custom-style') </head> <body> @include('layouts.top') <div class="container-fluid container-min"> @yield('content') </div> </body> </html>
  25. Laravel 4 Form::macro(‘itemFormRow’, function ($label, $inputType, $inputName) { return ‘<div

    class=”form-group”> <label class=”col-sm-3 control-label”>’.$label.’</label> <div class=”col-sm-4”> <input type=”text” name=”’.$inputName.’”/> </div> </div>’; });
  26. Laravel 4 @extends(‘layout’) @section(‘content’) {{ Form::open(array('route'=>'item.add', 'method'=>'post'))}} {{ Form::itemRowField(‘Name’, ‘text’,

    ‘item_name’)}} {{ Form::itemRowField(‘Cost’, ‘text’, ‘item_cost’)}} {{ Form::close() }} @stop
  27. Laravel 4 Route::group(array( 'prefix'=>'/item/, 'namespace'=>'App\Item\'), function () { Route::get('/', 'ItemsController@get');

    Route::post('/',array( ‘as’=>’item.add’, ‘uses’=>’'ItemsController@add'’) ); Route::put('/', 'ItemsController@update'); Route::get('/change-property', ItemsController@formChangeProperty'); Route::post('/change-property', 'ItemsController@changeProperty'); });
  28. Laravel 4 class Item extends Eloquent { protected $fillable =

    array(‘name’, ‘cost’); } $input = Input::get(); $validator = Validator::make( $input, array(‘name’ => 'required|min:5', ‘cost’=>’numeric’) ); if($validator->fails()) { throw new Exception(‘Incorrect item data’); } return Item::create($input); Модель Контроллер
  29. Laravel 4 abstract class Validation { protected $rules; protected $input;

    public function __construct($input) { $this->input = $input; } public function validate() { $validator = Validator::make($this->getInput(), $this->getRules()); if($validator->fails()) { throw new ValidationException($validator); } } abstract public function getRules(); public function getInput() { return $this->input; } }
  30. Laravel 4 class ItemValidationException extends Exception { public function __construct($validator)

    { $this->message = 'Item data is not valid'; $this->validator = $validator; } public function getErrors() { return $this->validator->messages(); } } class ItemValidation extends Validation { public function getRules() { return ['name' => 'required|min:5', 'cost' => 'numeric']; } } App::error(function (ItemValidationException $e) { $errorResponse = ['message' => $e->getMessage(),'errors' => $e- >getErrors() ]; return Response::json($errorResponse, $statusCode = 422); });
  31. Laravel 4 $input = Input::get(); $validator = Validator::make( $input, array(‘name’

    => 'required|min:5', ‘cost’=>’numeric’) ); if($validator->fails()) { throw new Exception(‘Incorrect item data’); } return Item::create($input); $itemData = Input::all(); App::make('ItemValidation', [$itemData])->validate(); return Users::create($itemData);