Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Getting Started With Laravel 4
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Christopher Pitt
April 04, 2014
Technology
1.1k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Getting Started With Laravel 4
Christopher Pitt
April 04, 2014
More Decks by Christopher Pitt
See All by Christopher Pitt
Making Robots (PHP Unicorn Conf)
chrispitt
1
250
Transforming Magento (NomadMage 2017)
chrispitt
2
140
Forget What You Know
chrispitt
1
180
Monads In PHP → php[tek]
chrispitt
3
590
Breaking The Enigma → php[tek]
chrispitt
0
280
Turn on the Generator!
chrispitt
0
200
Implementing Languages (FluentConf)
chrispitt
1
390
Async PHP (Sunshine)
chrispitt
0
540
Helpful Robot
chrispitt
0
180
Other Decks in Technology
See All in Technology
データ品質を壊しながらSnowflakeのAIに分析させてみた
kawanago
0
470
Meet AgentCore Identity Consent Portal
hironobuiga
3
180
スキルを作る、その前に!複数人で使われるスキルを 作るためのプロセス
junkifurukawa
2
200
カンファレンスに参加した後の浮遊感とセルフケア
pauli
0
310
「とりあえず動く」の先へ。 AI時代のチーム開発と内部設計/2026-slsdays
slsops
0
130
おそらく日本で唯一のDevRelインターン生として
husengs7
0
160
IR Today: Theory, Practice, and Agents
dtunkelang
0
340
Apache Iceberg が拓く AI 時代のオープンレイクハウス
tomtanaka
0
220
使いこなすために知っておきたい Azure SRE Agent アンチパターン
torumakabe
0
100
AI 時代の Azure エンジニアリング ~ 私たちは何を磨き、何を任せるのか ~
chack411
1
410
自主式軟體工廠
philipz
0
180
BedrockとLambdaで作る リアルタイム進行型推理ゲーム
kawametho
0
180
Featured
See All Featured
The Limits of Empathy - UXLibs8
cassininazir
1
700
BBQ
matthewcrist
89
10k
Thoughts on Productivity
jonyablonski
76
5.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
A better future with KSS
kneath
240
18k
Navigating Team Friction
lara
192
16k
The SEO identity crisis: Don't let AI make you average
varn
0
570
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Transcript
getting started with laravel 4
about me ! ›❯ i live in cape town ›❯
i work for http://n.joepublic.co.za ›❯ i love programming ›❯ i have written a book on mvc framework development ›❯ i am finishing a book on laravel applications
the disclaimers ! ›❯ much of this is my opinion
›❯ i have a vested interest in the success of laravel
laravel ! ›❯ laravel is an mvc framework ›❯ laravel
installs with composer ›❯ laravel uses 24 community packages (11 from symfony)
artisan ! ›❯ artisan is a command-line utility ›❯ artisan
ships with laravel 4 ›❯ artisan automates complicated and laborious tasks
// terminal ! ›❯ php artisan env Current application environment:
production ! ›❯ php artisan down Application is now in maintenance mode.
// continued... ! ›❯ php artisan Laravel Framework version 4.1.24
! Usage: [options] command [arguments] ...
routes ! ›❯ routes link a url to a function
›❯ routes are specified by request method
// app/routes.php ! Route::get("products", function() { return "show the products";
}); ! Route::post("product", function() { return "save the product"; });
// terminal ! ›❯ php artisan serve Laravel development server
started on http://localhost:8000 ! ›❯ curl -X GET "http://localhost:8000/products" show the products
// app/routes.php ! Route::get("product/{id}", function($id) { return "show the product
{$id}"; }); ! Route::get("category/{id?}", function($id = 1) { return "save the category {$id}"; });
// continued... ! Route::get("user/{id}", function($id) { return "show the user
{$id}"; })->where("id", "[a-z]+");
// continued... ! Route::pattern("product_id", "[0-9]+"); ! Route::get("product/{product_id}", function($product_id) { return
"show the product {$product_id}"; }); ! Route::get("product/{product_id}/images", function($product_id) { return "show the product images for {$product_id}"; });
// terminal ! ›❯ curl -X GET "http://localhost:8000/bridge/gimly" run, fools
! ›❯ curl -X GET "http://localhost:8000/bridge/balrog" YOU SHALL NOT PASS
views ! ›❯ views are where php meets html ›❯
views can be plain php ›❯ blade is a template engine
// app/routes.php ! Route::get("/", function() { return View::make("hello"); });
// app/views/hello.php ! <!doctype html> <html lang="en"> <head> <meta charset="UTF-8">
<title>Laravel PHP Framework</title> ...
// app/routes.php ! Route::get("products", function() { return View::make("products/index"); });
// app/views/products/index.php ! <div class="products"> show the products </div>
// app/routes.php ! Route::get("products", function() { $products = [ ["the
red one", 12.99], ["the blue one", 13.99], ["the black one", 11.99] ]; ! return View::make("products/index", compact("products")); });
// app/views/products/index.php ! <div class="products"> <?php foreach ($products as $product):
?> <div class="product"> <?php echo $product[0]; ?> <span class="price"><?php echo $product[1]; ?></span> </div> <?php endforeach; ?> </div>
// app/views/products/index.blade.php ! <div class="products"> @foreach ($products as $product) <div
class="product"> {{ $product[0] }} <span class="price">{{ $product[1] }}</span> </div> @endforeach </div>
// continued... ! @extends("layout") ... ! @section("content") ... @stop
// app/views/layout.blade.php ! @yield("content", "default") ... ! @include("includes/header") ...
controllers ! ›❯ controllers connect data to views ›❯ controllers
redirect requests ›❯ controllers shouldn't be doing much more than that
// terminal ! ›❯ php artisan controller:make UsersController Controller created
successfully! ! ›❯ php artisan controller:make PostsController Controller created successfully! ! ›❯ php artisan controller:make TagsController Controller created successfully!
// app/controllers/UsersController.php ! class UsersController extends \BaseController { ... }
// app/routes.php ! Route::get("users", [ "as" => "users.index", "uses" =>
"UsersController@index" ]);
migrations ! ›❯ migrations are scripted database changes ›❯ migrations
have a special dsl ›❯ migrations need to be run
// terminal ! ›❯ php artisan migrate:make create_posts_table Created Migration:
2014_04_01_025625_create_posts_table Generating optimized class loader ! ›❯ php artisan migrate:make create_users_table Created Migration: 2014_04_01_025631_create_users_table Generating optimized class loader
// continued... ! ›❯ php artisan migrate:make create_tags_table Created Migration:
2014_04_01_025656_create_tags_table Generating optimized class loader ! ›❯ php artisan migrate:make create_posts_tags_table Created Migration: 2014_04_01_025701_create_posts_tags_table Generating optimized class loader
// app/database/migrations/[timestamp]_create_users_table.php ! use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; ! class CreatePostsTable
extends Migration { ... }
// continued... ! Schema::create("users", function(Blueprint $table) { $table->increments("id"); $table->string("username"); $table->string("password");
$table->string("email"); $table->timestamps(); });
// terminal ! ›❯ php artisan migrate Migration table created
successfully. Migrated: 2014_04_01_025625_create_posts_table Migrated: 2014_04_01_025631_create_users_table Migrated: 2014_04_01_025656_create_tags_table Migrated: 2014_04_01_025701_create_users_tags_table
seeders ! ›❯ seeders are scripted database populators ›❯ seeders
can insert as much or as little data as required ›❯ seeders need to be run
// app/database/seeds/DatabaseSeeder.php ! class DatabaseSeeder extends Seeder { ... }
// continued... ! public function run() { $this->call("UsersTableSeeder"); }
// app/database/seeds/UsersTableSeeder.php ! DB::table("users")->insert([ [ "username" => "chrispitt", "password" =>
Hash::make("password"), "email" => "
[email protected]
", "created_at" => time(), "updated_at" => time() ] ]);
// terminal ! ›❯ php artisan db:seed Seeded: UsersTableSeeder
query builder ! ›❯ query builder builds sql queries ›❯
query builder has its own dsl
eloquent ! ›❯ eloquent is a programmatic wrapper for database
tables ›❯ eloquent is best for single instances
authentication ! ›❯ authentication is about blocking the wrong users
and allowing the right ones ›❯ authentication needs a special eloquent model ›❯ alternatives exist
thanks ! ›❯ follow http://twitter.com/followchrisp ›❯ learn http://tutorials.io ______ <
moo! > ------ \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||