рд╣рд╛рдВ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдореБрджрд╛рдп рдФрд░ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдЕрдиреНрдп рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕реНрддрд░ рд╕реЗ рдиреАрдЪреЗ рдереЗред рдРрд╕рд╛ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ PHP рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЧрдВрджреЗ рд╡рд░реНрдбрдкреНрд░реЗрд╕ рдереАрдо рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рдирд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ, рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ, рдЪреАрдЬреЗрдВ рдмрджрд▓рдиреЗ рд▓рдЧреАрдВ - рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрддред рдЬреИрд╕реЗ рдХрд┐ рдЬрдм рдЪреБрдбрд╝реИрд▓ рдмрд░реНрддрди рдХреЛ рд╣рд┐рд▓рд╛ рд░рд╣реА рдереА, рдЕрднрд┐рдирд╡ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдХрд╣реАрдВ рд╕реЗ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реБрдИрдВред рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрдЧреАрддрдХрд╛рд░ рдереА: PHP рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╡реНрдпрд╛рдкрдХ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрдХ (рдЬреИрд╕реЗ рдХрд┐ рд░реВрдмреА рдХреЗ рд▓рд┐рдП рдмреБрдВрдбрд▓рд░ рдпрд╛ Node.js рдХреЗ рд▓рд┐рдП NPM)ред рдЕрддреАрдд рдореЗрдВ, PHP рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ PEAR (рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдбрд░рд╛рд╡рдирд╛ рд╕рдкрдирд╛ рдерд╛) рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдм, рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╡реЗ рдмрд╕ JSON рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рд╣реИ, рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рдЗрд╕рдореЗрдВ рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред
PHP рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рднреАрдбрд╝-рднрд╛рдбрд╝ рд╡рд╛рд▓реА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЬреИрд╕реЗ рд╣реА CodeIgniter рдиреЗ рднрд╛рдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдЯреЗрд▓рд░ рдУрдЯрд╡реЗрд▓ рдХрд╛ рд▓рд╛рд░рд╡реЗрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдорд╛рдЬ рдХрд╛ рдкреНрд░рд┐рдп рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЦ рд╕реЗ рдЙрднрд░рд╛ред рдРрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде, рд▓рд╛рд░рд╡реЗрд▓ рдФрд░ рдкреАрдПрдЪрдкреА рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдордЬреЗрджрд╛рд░ рдерд╛! рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдврд╛рдВрдЪреЗ рдХреЗ рдЪреМрдереЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕рдиреЗ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЕрдВрдд рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрд╛ рдХрд┐ рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП, рд╕рднреА рдЪреАрдЬреЗрдВ рдЬрдЧрд╣ рдореЗрдВ рдЧрд┐рд░ рдЧрдИрдВред
![рдЫрд╡рд┐](https://habrastorage.org/getpro/habr/post_images/6a2/5a3/16d/6a25a316d47cae4ee286ffe974f860c4.png)
рдорд╛рдЗрдЧреНрд░реЗрд╢рди (рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг) рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рд╣реЛ рдЧрдпрд╛! рдХреИрд╕реЗ рд╕рдХреНрд░рд┐рдп рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ? рдмреЗрд╢рдХ, рдПрд▓реЛрдХреНрд╡реЗрдВрдЯ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд░реЗрдЧрд╛ред рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ? рдмреЗрд╢рдХ! рд░реВрдЯрд┐рдВрдЧ (рд░реВрдЯрд┐рдВрдЧ)? рд╣рд░ рддрд░рд╣ рд╕реЗ! рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП HTTP рдкрд░рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд▓рд╛рд░рд╡реЗрд▓ рдХрдИ рдЙрддреНрдХреГрд╖реНрдЯ рд╕рд┐рдореНрдлрдиреА рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЬрдм рд╡реНрдпрд╡рд╕рд╛рдп рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рд╣рд░ рдореМрдХрд╛ рд╣реИ рдХрд┐ рд▓рд╛рд░рд╡реЗрд▓ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╣реА рдпрд╣ рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ!
![рдЫрд╡рд┐](https://habrastorage.org/getpro/habr/post_images/164/674/2cd/1646742cd2daded685e998e0269a7dae.png)
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, PHP рдЬреЗрдВрдЧ рдХреЗ рдПрдХ рдЦреЗрд▓ рдХреА рддрд░рд╣ рдерд╛ - рдЧрд┐рд░рдиреЗ рд╕реЗ рдПрдХ рдШрди - рдЕрдЪрд╛рдирдХ, рд▓рд╛рд░рд╡реЗрд▓ рдФрд░ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕реБрд░рдВрдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рдЖрдпрд╛ред рддреЛ рд╣рдо рд╕рднреА рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ, рдФрд░ рдЪрд▓реЛ рд╕рдм рдХреБрдЫ рдЦреЛрджрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рд░реВрдкрд░реЗрдЦрд╛ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИ!
1. рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдЕрдиреБрд░реЛрдз *
рд▓рд╛рд░рд╡реЗрд▓ PHP рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕рдХреНрд░рд┐рдп рд░рд┐рдХреЙрд░реНрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдПрд▓реЛрдХреЗрдВрдЯ рдСрд░реНрдбрд░ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдСрд░реНрдбрд░ рдЯреЗрдмрд▓ рд╣реИред
class Order extends Eloquent {}
, PHP. SQL. .
Order::all();
! , , . :
$orders = Order::orderBy('release_date', 'desc')->get();
, , . , , .
$order = new Order; $order->title = 'Xbox One'; $order->save();
! Laravel, , , .
* тАФ Eloquent тАФ Active Record Laravel, .
2. ()
Laravel , . Sinatra ? Laravel ,
Route::get('orders', function() { return View::make('orders.index') ->with('orders', Order::all()); });
API, , . , Laravel .
Route::get('orders', 'OrdersController@index');
! , Laravel ? тАФ , .
3.
, ? , . Laravel? , , Eloquent .
class Task extends Eloquent { public function user() { return $this->belongsTo('User'); } } class User extends Eloquent { public function tasks() { return $this->hasMany('Task'); } }
! id = 1. 2 .
$user = User::find(1); $tasks = $user->tasks;
, , , , .
$task = Task::find(1); $user = $task->user;
4.
, . тАФ - . , .
{{ Form::model($order) }} <div> {{ Form::label('title', 'Title:') }} {{ Form::text('title') }} </div> <div> {{ Form::label('description', 'Description:') }} {{ Form::textarea('description') }} </div> {{ Form::close() }}
Order, . !
5.
, , . , Laravel , .
, , .
$questions = Question::remember(60)->get();
! , , , .
6.
, . тАФ , .
, Laravel (), .
View::composer('layouts.nav', function($view) { $view->with('tags', ['tag1', 'tag2']); });
, , layouts/nav.blade.php, ( ) $tags.
7.
Laravel . , , , , Auth::attempt(). , users, .
$user = [ 'email' => 'email', 'password' => 'password' ]; if (Auth::attempt($user)) { // }
, /logout URI?
Route::get('logout', function() { Auth::logout(); return Redirect::home(); });
8.
RESTfully Laravel ! , Route::resource() .
Route::resource('orders', 'OrdersController');
8 .
- GET /orders
- GET /orders/:order
- GET /orders/create
- GET /orders/:order/edit
- POST /orders
- PUT /orders/:order
- PATCH /orders/:order
- DELETE /orders/:order
, OrdersController :
php artisan controller:make OrdersController
, , . , /orders index, /orders/create тАФ create .
, RESTful API.
9. Blade
, PHP , . , . Laravel Blade, . .blade.php, . :
@if ($orders->count()) <ul> @foreach($orders as $order) <li>{{ $order->title }}</li> @endforeach </ul> @endif
10.
Laravel Composer, PHPUnit тАЬ тАЭ. phpunit , .
Laravel
, 200.
public function test_home_page() { $this->call('GET', '/'); $this->assertResponseOk(); }
, , , , , .
public function test_contact_page_redirects_user_to_home_page() { $postData = [ 'name' => 'Joe Example', 'email' => 'email-address', 'message' => 'I love your website' ]; $this->call('POST', '/contact', $postData); $this->assertRedirectedToRoute('home', null, ['flash_message']); }
11. тАЬ тАЭ
Laravel 4.1, 2013, Artisan, SSH . SSH :
SSH::into('production')->run([ 'cd /var/www', 'git pull origin master' ]);
run() , Laravel ! , Artisan ,
php artisan command:make DeployCommand
fire() .
12.
Laravel Observer, . , , illuminate.query, .
.
Event::listen('user.signUp', function() { // , , // });
Laravel, , , . Laravel , IoC .
Event::listen('user.signUp', 'UserEventHandler');
13.
![image](https://habrastorage.org/getpro/habr/post_images/75b/245/7de/75b2457dedc13ba6a7cae386201605f2.png)
, , . , routes.php (, ).
Laravel routes, , , .
php artisan routes
14.
, . , . , , , . , .
, , ?
Queue::push('SignUpService', compact('user'));
, , , Laravel Iron.io тАЬpushтАЭ . , , . php artisan queue:subscribe, Iron.io , . .
![image](https://habrastorage.org/getpro/habr/post_images/9a7/1ff/d67/9a71ffd6772983dd4c63178e3c4813c3.png)
15.
, Laravel ! Validator . make, Laravel .
$order = [ 'title' => 'Wii U', 'description' => 'Game console from Nintendo' ]; $rules = [ 'title' => 'required', 'description' => 'required' ]; $validator = Validator::make($order, $rules); if ($validator->fails()) { var_dump($validator->messages()); // validation errors array }
16. Tinker
![image](https://habrastorage.org/getpro/habr/post_images/53a/2e4/36a/53a2e436ac009eac7acf9712283d9a49.png)
, Laravel , . tinker .
Tinker Boris.
$ php artisan tinker
> $order = Order::find(1); > var_dump($order->toArray()); > array(...)
17.
, . , тАЬтАЭ , , , . , , php artisan migrate, .
users, :
php artisan migrate:make create_users_table
, , . , php artisan migrate . ! ? ! php artisan migrate:rollback.
.
public function up() { Schema::create('faqs', function(Blueprint $table) { $table->integer('id', true); $table->text('question'); $table->text('answer'); $table->timestamps(); }); } public function down() { Schema::drop('faqs'); }
, drop() up(). , тАЬтАЭ . , , SQL?
18.
Laravel . , тАЬLaravel 4 GeneratorsтАЭ, . , , pivot .
. , :
php artisan generate:migration create_users_table --fields="username:string, password:string"
. .
Laravel 4 Generators Composer.
19.
, . , , .
, Laravel .
php artisan command:make MyCustomCommand
. , app/commands/MyCustomCommand.php, .
protected $name = 'command:name'; protected $description = 'Command description.';
, fire() . Artisan, app/start/artisan.php.
Artisan::add(new MyCustomCommand);
, , ! .
20.
Laravel . тАЬтАЭ , , , (Route::get(), Config::get(), ), .
тАЬ тАЭ IoC , тАЬтАЭ . :
Validator::shouldReceive('make')->once();
, shouldReceive . тАЬ тАЭ, Laravel Mockery. , , .
21.
, Laravel, , тАЬ тАЭ, . :
{{ Form::open() }} {{ Form::text('name') }} {{ Form::textarea('bio') }} {{ Form::selectYear('dob', date('Y') - 80, date('Y')) }} {{ Form::close() }}
? Laravel !
22. IoC (Inverse of control)
Laravel IoC , , . , .
typehint , Laravel, PHP Reflection API, .
public function __construct(MyDependency $thing) { $this->thing = $thing; }
IoC , .
$myClass = App::make('MyClass');
, IoC . typehint , Laravel .
23.
. , тАФ ! , , . .
. dev API. .
, Laravel . bootstrap/start.php.
local , hostname .
$env = $app->detectEnvironment(array( 'local' => array('your-machine-name'), ));
, . . , Laravel! detectEnvironment.
$env = $app->detectEnvironment(function() { return getenv('ENV_NAME') ?: 'local'; });
, ( ), local.
24.
Laravel . app/config , , , . , API dev .
<?php // app/config/development/billing.php return [ 'api_key' => 'your-development-mode-api-key' ];
.
Config::get(тАШbilling.api_keyтАЩ)
Laravel , .
25.
, Laravel , . , , Laravel.