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
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
AIエージェント時代のPlatform as a Product —— テックリードがPdMとして回す発見・導入・計測 / Platform as a Product in the AI Agent Era
toshi0607
1
550
AI Made Us Faster at Solving the Wrong Problems
marceloancelmo
0
110
データ品質を壊しながらSnowflakeのAIに分析させてみた
kawanago
0
340
覗いてみよう 関数型ビジュアル言語×2Dグラフィックスの世界
yohyamasaki
0
160
3人で1000GPU超を統合運用する?マルチクラウド&オンプレを跨ぐ、構築と運用のリアル!
kazukun0716
2
800
Confitura 2026
logico_jp
0
120
10年欲しかった音楽管理アプリを、AIと一緒に作りはじめた
judau
1
200
顧客の成果創出とプロダクトの成長を 両立するためのFDE
sansantech
PRO
0
570
営業オントロジーの作り方と、エージェントからの辿り方 ── ナレッジワークの現場から
kworkdev
PRO
1
220
1万名の社員が使う認証基盤で どう信頼性を担保するか?
kairim0
0
120
人にやさしく、AIにやさしく、書き手を選ばないIaCのガードレール再考 / Rethinking IaC Guardrails for Humans and AI Alike
kohbis
5
1.9k
生成AIを使って「人が」考える技術 ― AI時代の人機共想と実践ノウハウ|UNITT AC2026
ishiirikie
0
500
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
380
Believing is Seeing
oripsolob
1
230
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
750
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Google's AI Overviews - The New Search
badams
0
1.6k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
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 | || ||