ã ãããããªãã¯
Laravelãã¬ãŒã ã¯ãŒã¯ã詊ããŠã¿ãããåŠã³ãããšæã£ãŠããŸãã
ä»ã®
PHP
ãã¬ãŒã ã¯ãŒã¯ã«ç²ŸéããŠããå Žå-é£ããããšã§ã¯ãããŸããããããã§ãªãå Žå-ããã¯æåã®ãã¬ãŒã ã¯ãŒã¯ã®åªããéžæè¢ã§ãã

èšäºã¯éåžžã«å€§ããã§ãã 鱿«ã«å®å
šã«èªãããšããå§ãããŸãã
æ ãè
ã®å ŽåïŒ
Githubã¢ããªèšçœ®
Laravelãã€ã³ã¹ããŒã«ããã«ã¯ã
Composerãå¿
èŠã§ã
Composerã¯ã PHP
äŸåé¢ä¿ç®¡çããŒã«ã§ãã ãããžã§ã¯ãã«å¿
èŠãªäŸåã©ã€ãã©ãªã宣èšãããããžã§ã¯ãã«ã€ã³ã¹ããŒã«ã§ããŸãã
- äœæ²å®¶
ç°å¢ã¯
*nix
ç°å¢ã«ã€ã³ã¹ããŒã«ãããŸãïŒãµã€ãã«ã¯
Windowsã«ã€ã³ã¹ããŒã«ããããã®ããã¥ã¢ã«ããããããã«
WAMPã
Gitãªã©ã®ãµãŒããŒãå¿
èŠã§ãïŒã
éåžžã«ã¯ãªãŒã³ãªOSããããšããŸãã æ¬¡ã«ãã¿ãŒããã«ãéãã
ãããã®è¡ã
å
¥åããŠã³ããŒããŠè²Œãä»ããŸã
ãã°ãããããšãå¿
èŠãªããŒã«ããã¹ãŠã€ã³ã¹ããŒã«ãããŸãã
Laravel
ã®ã€ã³ã¹ããŒã«ã«çŽæ¥é²ã¿ãŸãã
habrãã©ã«ããŒã«
laravel
ãããžã§ã¯ããäœæããŸã
composer create-project laravel/laravel habr --prefer-dist
äœæããããããžã§ã¯ãã«ç§»åãã
php artisan serve
ã³ãã³ããå®è¡ããŠãã¹ãŠãæ©èœããããšã確èªããŸããã
cd habr php artisan serve
ããŒã«ã«ãµãŒããŒã¯
httpïŒ// localhostïŒ8000ã§å©çšã§ããŸãã
念ã®ããã è·äººã¯Laravel
ããã³ãã³ãã©ã€ã³ã¹ã¯ãªããã§ãã éçºã§äœ¿çšããããã®äŸ¿å©ãªã³ãã³ãã倿°çšæãããŠããŸãã Symfony
ã³ã³ãœãŒã«ã³ã³ããŒãã³ãã®äžã§å®è¡ãããŸãã ïŒ Artisan CLI ïŒã ã³ãã³ãã©ã€ã³ã§ããŸããŸãªäŸ¿å©ãªãã®ãäœæã§ãã䟿å©ãªã³ãã³ãããããããããŸãã ã³ãã³ãã®ãªã¹ããphp artisan list
ã¯ãã³ãã³ãã©ã€ã³ã§php artisan list
ãšå
¥åããŸãã
ã¢ãã¬ã¹
httpïŒ// localhostïŒ8000ã«ç§»åãããšãæçš¿ã®æåã«çŸããã¹ã¯ãªãŒã³ã»ãŒããŒã衚瀺ãããŸãã
ã«ã¹ã¿ãã€ãº
ããŒã¿ããŒã¹ïŒä»¥éDBãšåŒã³ãŸãïŒã«æ¥ç¶ããããã«ã
Laravel
ã«ã¯
app / config /ãã©ã«ããŒã«ããæ§æãã¡ã€ã«
database.phpããããŸãã
ãŸãã
MySQL
ããŒã¿ããŒã¹ãšãŠãŒã¶ãŒãäœæã
MySQL
mysql -u root -p
ãããïŒ
MySQL
ã«ã¢ã¯ã»ã¹ããããã®ãã¹ãŠã®ããŒã¿ããã
MySQL
ããã¹ã¯ãŒã
my_passwordãæã€ãŠãŒã¶ãŒ
habrãšã
localhostãã¹ãäžã®ããŒã¿ããŒã¹
habrã§ãã ããŒã¿ããŒã¹æ§æãã¡ã€ã«ã«ç§»åããŠãèšå®ã倿ŽããŸãããã

Laravel
ã¯ã
ç§»è¡ãš
ã¹ããŒã ãã«ããŒãšããåªããããŒã«ããããŸãã
ç§»è¡ã¯ãããŒã¿ããŒã¹ã®ããŒãžã§ã³ç®¡çã®äžçš®ã§ãã ããã«ãããéçºããŒã ã¯ããŒã¿ããŒã¹ã¹ããŒãã倿Žããã¹ããŒãã®çŸåšã®ç¶æ
ãåžžã«æŽæ°ã§ããŸãã éåžžãç§»è¡ãšã¹ããŒããã«ããŒã䜵çšãããšãããŒã¿ããŒã¹ã¹ããŒãã®ç®¡çã容æã«ãªããŸãã
- ç§»è¡
Schema Builderã¯Schemaã¯ã©ã¹ã§ãã ããŒã¿ããŒã¹å
ã®ããŒãã«ãæäœããããšãã§ããŸãã Laravel
ãµããŒããããã¹ãŠã®ããŒã¿ããŒã¹ã§ããŸãæ©èœããããããã¹ãŠã®ã·ã¹ãã ã«åäžã®API
ãåããŠããŸãã
- ã¹ããŒã ãã«ããŒ
æåã«ãç§»è¡ããŒãã«ãäœæããŸãã
php artisan migrate:install
ããŒã¿ããŒã¹æ¥ç¶èšå®ãæ£ããå Žåãç§»è¡ãšããŒãã«ãäœæããæºåãã§ããŠããŸãã
ãããããã®åã«ãWebã¢ããªã±ãŒã·ã§ã³ãããå¹ççãã€è¿
éã«äœæããããã«äœ¿çšã§ãã远å ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã玹ä»ããŸãã
Laravel 4ãžã§ãã¬ãŒã¿ãŒ
ãžã§ããªãŒãŠã§ã€ã®è¶
䟿å©ãªããŒã«
ãžã§ãã¬ãŒã¿ãŒ ã
Github次ã®ãããªå€ãã®äŸ¿å©ãªã³ãã³ãã
è·äººãªã¹ãã«è¿œå ããŸãã
- generateïŒmodel-ã¢ãã«ãäœæããŸã
- generateïŒcontroller-ã³ã³ãããŒã©ãŒãäœæããŸã
- generateïŒseed-ããŒã¿ããŒã¹ã«èšå®/åœã®æ
å ±ãå
¥åããããã®ãã¡ã€ã«ãäœæããŸã
- generateïŒview-ãã³ãã¬ãŒããäœæããŸã
- generateïŒç§»è¡-ç§»è¡ãäœæããŸã
- generateïŒresource-ãªãœãŒã¹ãäœæããŸã
- generateïŒscaffold-ãããã¿ã€ããäœæããŸãïŒæãè峿·±ãã®ã¯ãåŸã»ã©è©³ãã調ã¹ãŸãïŒïŒ
- generateïŒform-ãã©ãŒã ãäœæããŸã
- generateïŒtest-ãã¹ããäœæããŸã
- generateïŒãããã-ããããããŒãã«ã®ç§»è¡ãäœæããŸã
ããã±ãŒãžã®ã€ã³ã¹ããŒã«
Composer
ã䜿çšããããã±ãŒãžã®ã€ã³ã¹ããŒã«ã¯éåžžã«ç°¡åã§ãã ã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã«ãã
composer.jsonãã¡ã€ã«ãç·šéãã
"way/generators": "1.*"
ã
"require"
ãªã¹ãã«è¿œå
"require"
ãŸãã
"require": { "laravel/framework": "4.1.*", "way/generators": "1.*" },
ãã®åŸããããžã§ã¯ãã®äŸåé¢ä¿ãæŽæ°ããå¿
èŠããããŸãã ã¿ãŒããã«ã«å
¥ã
composer update
æåŸã®
ä»äžãã¯ã
app / config / app.phpæ§æãã¡ã€ã«ã®ã¢ããªã±ãŒã·ã§ã³ãããã€ããŒã®ãªã¹ããžã®ãšã³ããªã§ãã
'Way\Generators\GeneratorsServiceProvider'
ããã§ã
php artisan
ã³ãã³ããªã¹ãã«ãæ°ãã
generate
ã³ãã³ããå«ãŸ
generate
ããã«ãªããŸãã æ¬¡ã®ã»ã¯ã·ã§ã³ã§ã¯ã
generate
ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãäœæããéçºãé«éå
generate
æ¹æ³ã瀺ããŸãã
ã¢ããªã±ãŒã·ã§ã³äœæ
å²åŒä»ãã®
ããã°ãµã€ããäœæãããšããŸãã ããã«ã¯æ¬¡ã®ãã®ãå¿
èŠã§ãã
- ã¡ãŒã«ããŠãŒã¶ãŒåããã¹ã¯ãŒããå«ããŠãŒã¶ãŒããŒãã«
- 圹å²è¡š
- ãŠãŒã¶ãŒåœ¹å²è¡š
- éœåžã®è¡š
- äŒç€Ÿè¡š
- ã¿ã°è¡š
- ãã£ãŒã«ãã®ããå²åŒããŒãã«ïŒã¿ã€ãã«ã説æãéœåžãäŒç€Ÿãå²åŒçãåçãå²åŒã®æå¹æé
- è©äŸ¡ä»ãã®è©äŸ¡è¡š
- å²åŒã¿ã°è¡š
ããŒã¿ããŒã¹ã®ããŒãã«ã¹ããŒãã®æŠèŠã説æããŸãã ç§ã¯ãã®ãããªãã®ãåŸãŸããïŒ

ãã®
ãžã§ãã¬ãŒã¿ãŒ 'yã«æè¬ããŸãã ã¡ãªã¿ã«ã10è¡ãç»é²ããã ããªã®ã§ã次ã®ãšããã§ãã
php artisan generate:migration create_users_table --fields="email:string:unique, password:string[60], username:string:unique, remember_token:string:nullable" php artisan generate:scaffold role --fields="role:string:unique" php artisan generate:pivot users roles php artisan generate:scaffold city --fields="name:string:unique" php artisan generate:scaffold company --fields="title:string:unique" php artisan generate:scaffold tag --fields="title:string:unique" php artisan generate:scaffold offer --fields="title:string, description:text, city_id:integer:unsigned, company_id:integer:unsigned, off:integer:unsigned, image:string, expires:date" php artisan generate:scaffold comment --fields="body:text, user_id:integer:unsigned, offer_id:integer:unsigned, mark:integer" php artisan generate:pivot offers tags
æåŸã®ã³ãã³ãã䜿çšãããšããŸã èšé²ãããŠããªããã¹ãŠã®ç§»è¡ãããŒã¿ããŒã¹ã«å
¥åãããŸãã éèŠãªããšã¯ããã¹ãŠã®æ°ããç§»è¡ã1ã€ã®ã¹ã¿ãã¯ã«ãã£ãŠèµ·åãããããšã§ãã ãã€ã°ã¬ãŒã·ã§ã³ãããŒã«ããã¯ããããã«ã
php artisan migrate:rollback
ã³ãã³ããããããã¹ãŠã®ãã€ã°ã¬ãŒã·ã§ã³ããŒãã«ããŒã«ããã¯ããã«ã¯ã
migrate:reset
ããŒãã«ããŒã«ããã«ã¯ããã¹ãŠã®
migrate:refresh
ãã€ã°ã¬ãŒã·ã§ã³ãå®è¡ããŸãã
4.1.25以éã® Laravel
ããŒãžã§ã³ã§ã¯ãçãŸããCookieã§ç©Žãå¡ãã»ãã¥ãªãã£ã¢ããããŒãããããŸããã ã¢ããããŒããšæé ã®è©³çްã«ã€ããŠã¯ã http ïŒ //laravel.com/docs/upgradeãã芧ãã ãã ãããŒãžã§ã³ãLaravel
< 4.1.26ã®å Žå ã ãŸãã¯ã vlom88 http://habrahabr.ru/post/197454/#comment_7510479ããã³ã¡ã³ããèªãã§ ãã ãã ã
ãžã§ãã¬ãŒã¿ãŒã³ãã³ãã®è©³çްïŒ
- generateïŒmigrationç§»è¡åŒæ°åãåãå
¥ããé©åãªã¹ããŒããäœæããŸãã ã¹ããŒãåã«ããŒã¯ãŒããæå®ã§ããŸããããšãã°ã create -createã®åŸã«ãããŒãã«åãšããŒãã«ããŒã¯ãŒããç¶ããŸã ã ãªãã·ã§ã³--fields = ""ã䜿çšããŠãããŒãã«ã«è¿œå ãããã£ãŒã«ããæå®ããããšãã§ããŸãããªãã·ã§ã³ã§ã¯ããã£ãŒã«ãã®ããŒã¿ã¿ã€ããã³ã³ãã§åºåã£ãŠãªã¹ãããŸãã ç§»è¡ ã ããŒã¿åãªã©ã äœæãã
- generateïŒscaffoldã¯åŒæ°ãšããŠãªãœãŒã¹ïŒäŸãã°role ïŒãåãå
¥ãããããã®ãã¡ã€ã«ãäœæããŸãïŒ
- app / models / Role.php-ããŒã«ããŒãã«ãæäœããããã«Eloquent ORMããç¶æ¿ãããã¢ãã«ã®ã¯ã©ã¹ïŒããŒãã«èªäœã®ååã¯ãªãœãŒã¹åã®è€æ°åœ¢ã§ãïŒ
- app / controllers / RolesController.php-ãµã€ããžã®ãªã¯ãšã¹ãã«å¿çããã³ã³ãããŒã©ãŒã¯ã©ã¹ã¯RESTã³ã³ãããŒã©ãŒã§ããããŸã
HTTPã¡ãœãã | ãã¹ïŒURLïŒ | ã¢ã¯ã·ã§ã³ | ã«ãŒãå |
ã²ãã | /ãªãœãŒã¹ | ã€ã³ããã¯ã¹ | resource.index |
ã²ãã | /ãªãœãŒã¹/äœæ | äœæãã | resource.create |
æçš¿ | /ãªãœãŒã¹ | åº | resource.store |
ã²ãã | /ãªãœãŒã¹/ {id} | èŠãã | resource.show |
ã²ãã | /ãªãœãŒã¹/ {id} /ç·šé | ç·šéãã | resource.edit |
PUT / PATCH | /ãªãœãŒã¹/ {id} | æŽæ°ãã | resource.update |
åé€ | /ãªãœãŒã¹/ {id} | ç Žå£ãã | resource.destroy |
- app / views / roles / index.blade.php-ãã¹ãŠã®ãªãœãŒã¹ã®ãªã¹ããæ
åœãããã³ãã¬ãŒãïŒéåžžã¯
URL
/ rolesã«ããGET
ãªã¯ãšã¹ãäžã«çæããURL
ïŒããã³ãã¬ãŒããšã³ãžã³ã«ã€ããŠã¯åŸã§èª¬æããŸã - app / views / roles / show.blade.php-ç¹å®ã®ãªãœãŒã¹ã®è¡šç€ºãæ
åœãããã³ãã¬ãŒãïŒ
GET
request for URL
/ roles / {id} ïŒ - app / views / roles / create.blade.php-ãªãœãŒã¹ã远å ããããã®ãã©ãŒã ãé
眮ãããŠãããã³ãã¬ãŒãïŒ
URL
GET
/ roles / create ïŒ - app / views / roles / edit.blade.php-ãªãœãŒã¹ãç·šéããããã®ãã©ãŒã ãé
眮ãããŠãããã³ãã¬ãŒãïŒ
URL
/ roles / {id} / edit}ã§ GET
ïŒ - app / views / layouts / scaffold.blade.php-ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¬ã€ã¢ãŠãïŒåºæ¬çãªhtml +ããŒãã¹ãã©ãã+æ¿å
¥ãããã³ã³ãã³ãã®ã³ã³ãããå«ãïŒ
- ã¢ããª/ããŒã¿ããŒã¹/ç§»è¡/ Create_roles_table.php-ç§»è¡
- app / database / seeds / RolesTableSeeder.php-ããŒãã«ã«ããŒã¿ãå
¥åãããã¹ãçšãã¡ã€ã«
- app / tests / controllers / RolesTest.php-ããŸããŸãªãã¹ã
ããŒã¿ãæŽæ°ããŠãã¡ã€ã«ã«è¿œå ããŸã
- app / database / seeds / DatabaseSeeder.php -RolesTableSeederãžã®åŒã³åºãã远å ããŸã
- app / routes.php-ãã¹ãŠã®ãªãœãŒã¹ã¡ãœããïŒ REST ïŒãã«ãŒãã¬ãžã¹ã¿ã«è¿œå ããŸã
- generateïŒãããã 2ã€ã®åŒæ°ïŒããŒãã«åïŒãåããŸãã 2ã€ã®
foreign key
ãå«ãããããããŒãã«ãäœæããŸã
ãã®ãžã§ãã¬ãŒã¿ãŒã®äœ¿çšäŸãããã®äœ¿ç𿹿³ãšãã®æçšæ§ãæç¢ºã«ç€ºããŠããããšãé¡ã£ãŠããŸãã
ãŸã äžè¶³ããŠããã®ã¯ãããŒãã«éã®ãªã³ã¯ã§ãã
ç¥ã£ãŠããããšãéèŠã§ãïŒ ããŒãã«ã®åã«å€éšããŒã远å ããå Žåãåã眲åãããŠããªãããšã確èªããå¿
èŠããããŸãã
ããŠããããã远å ããŸãïŒ
php artisan generate:migration add_foreign_user_id_and_offer_id_to_comments_table php artisan generate:migration add_foreign_city_id_and_company_id_to_offers_table
ãã®ãããªå€æŽã¯èªåçã«äœæãããªããããç§»è¡ãã¡ã€ã«èªäœã«ã€ã³ããã¯ã¹ã®è¿œå ãç»é²ããå¿
èŠããããŸãã
... class AddForeignUserIdAndOfferIdToCommentsTable extends Migration { ... public function up() { Schema::table('comments', function(Blueprint $table) { $table->index('user_id'); $table->index('offer_id'); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->foreign('offer_id')->references('id')->on('offers')->onDelete('cascade'); }); } ... public function down() { Schema::table('comments', function(Blueprint $table) { $table->dropForeign('comments_user_id_foreign'); $table->dropForeign('comments_offer_id_foreign'); $table->dropIndex('comments_user_id_index'); $table->dropIndex('comments_offer_id_index'); }); } } ... class AddForeignCityIdAndCompanyIdToOffersTable extends Migration { ... public function up() { Schema::table('offers', function(Blueprint $table) { $table->index('city_id'); $table->index('company_id'); $table->foreign('city_id')->references('id')->on('cities')->onDelete('cascade'); $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); }); } ... public function down() { Schema::table('offers', function(Blueprint $table) { $table->dropForeign('offers_city_id_foreign'); $table->dropForeign('offers_company_id_foreign'); $table->dropIndex('offers_city_id_index'); $table->dropIndex('offers_company_id_index'); }); } }
ããŒã¿ããŒã¹ã¹ããŒããèŠããšãããè¯ãç¶æ³ãããããŸãã

çŸæç¹ã§ã¯ããªãœãŒã¹ãžã®ãªã³ã¯ã¯ãã¹ãŠéããŠããã誰ã«ã§ãæž¡ãããšãã§ããŸãã
adminããŒã«ã远å ãããšããŸãã ãªã³ã¯
httpïŒ// localhostïŒ8000 / rolesã§ ãæ¬¡ã®å³ã衚瀺ãããŸãã

Laravelã®ãã³ãã¬ãŒããš
Bladeãã³ãã¬ãŒããšã³ãžã³ã«ã€ããŠå°ãã
ãã³ãã¬ãŒããã¡ã€ã«ã®å Žåãæ¡åŒµå
.blade.phpã䜿çšãããŸãã ãã¡ã€ã«
ã¢ããª/ãã¥ãŒ/ã¬ã€ã¢ãŠã/ scaffold.blade.phpãèŠããšã
// app/views/layouts/scaffold.blade.php <!doctype html> <html> <head> <meta charset="utf-8"> <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet"> <style> table form { margin-bottom: 0; } form ul { margin-left: 0; list-style: none; } .error { color: red; font-style: italic; } body { padding-top: 20px; } </style> </head> <body> <div class="container"> @if (Session::has('message')) <div class="flash alert"> <p>{{ Session::get('message') }}</p> </div> @endif @yield('main') </div> </body> </html>
ããã§äœãèµ·ãã£ãŠããŸããïŒ ãã¡ã€ã«èªäœã¯ã¹ã±ã«ãã³ã§ãããã³ã³ãã³ããŸãã¯å¥ã®ãã³ãã¬ãŒãã
main
ã»ã¯ã·ã§ã³ã«è¿œå ããããšã§æ¡åŒµã§ããã¬ã€ã¢ãŠãã§ãã äºéäžæ¬åŒ§
{{$ var}}ã¯
<ïŒPhp echo $ var;ã«é¡äŒŒããŠã
ãŸãã ïŒ> ããã§
Sessionã¯ã©ã¹ã¯ãäœããã®ã¡ãã»ãŒãžãæž¡ãå Žåã«ãŠãŒã¶ãŒã«ã¡ãã»ãŒãžã衚瀺ããããã«äœ¿çšãããŸãã ã¡ãã»ãŒãžã¯äžæçãªãã®ã§ãããããŒãžãæŽæ°ããããšæ¶ããŸãã æ°ããäœæãããã³ãã¬ãŒã
ã¢ããª/ãã¥ãŒ/ããŒã«/index.blade.phpãéããš // app/views/roles/index.blade.php @extends('layouts.scaffold') @section('main') <h1>All Roles</h1> <p>{{ link_to_route('roles.create', 'Add new role') }}</p> @if ($roles->count()) <table class="table table-striped table-bordered"> <thead> <tr> <th>Role</th> </tr> </thead> <tbody> @foreach ($roles as $role) <tr> <td>{{{ $role->role }}}</td> <td>{{ link_to_route('roles.edit', 'Edit', array($role->id), array('class' => 'btn btn-info')) }}</td> <td> {{ Form::open(array('method' => 'DELETE', 'route' => array('roles.destroy', $role->id))) }} {{ Form::submit('Delete', array('class' => 'btn btn-danger')) }} {{ Form::close() }} </td> </tr> @endforeach </tbody> </table> @else There are no roles @endif @stop
ãã®ãã³ãã¬ãŒãã
app / views / layouts / scaffold.blade.phpãã³ãã¬ãŒãã
@extends('layouts.scaffold')
ã
@extends('layouts.scaffold')
ã³ãŒãããã®ããšã瀺ããŠããããšãæããã«ãªã
ãŸã ã ããã§ã¯ã
/ã䜿çšããããšãã§ããŸããããã©ã«ããŒãåºåãããã«ãããã䜿çšãããŠããããšã«æ³šæããŠãã ããã
ãã®åŸã
@stop
ãæåã«çŸãããŸã§ããã¹ãŠã
main
ã»ã¯ã·ã§ã³ã«æžã蟌ãŸããŸãã ãŸããããªãã¿ã®
if - else - endif
ããã³
foreach - endforeach
ããã«ããŒé¢æ°
link_to_route
ãLaravelïŒãã«ããŒé¢æ°ïŒããã³
Form
ã¯ã©ã¹ã
Form
äœæã«æäŸãããã®ã䜿çšããŸãïŒå°ãªããšãForm :: openïŒïŒã䜿çšããå¿
èŠããããŸãïŒ
_token圢åŒã®è¿œå 屿§ã®äœææ¹æ³
-PUT / PATCHãŸãã¯DELETEã®å Žåã®ã¯ãã¹
ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªããã³
_methodã«å¯Ÿããä¿è·ïŒã
ãŸãããã¹ãŠã®ãªãœãŒã¹ãä¿è·ããããšã«ã€ããŠèããŠã¿ãŸãããã ãããè¡ãã«ã¯ãæ¿èªãå
¥åããå¿
èŠããããŸãã
app / controllersãã©ã«ããŒã«æ°ãã
LoginContoller
ãäœæããŸã
php artisan generate:controller LoginController
ãããŠãããã€ãã®ãã³ãã¬ãŒãã远å ããŸã
mkdir app/views/login php artisan generate:view index --path="app/views/login" php artisan generate:view register --path="app/views/login" php artisan generate:view dashboard --path="app/views/login"
ããã§ã¯ãã³ã³ãããŒã©ãŒèªäœã倿ŽããŸãããã 5ã€ã®ã¡ãœãããå¿
èŠã§ãã
- index-ãã°ã€ã³ãã©ãŒã ã®çæãæ
åœ
- ç»é²-ç»é²ãã©ãŒã ã®çæãæ
åœããŸã
- store-æ°èŠãŠãŒã¶ãŒã®ç»é²ãæ
åœããŸã
- login-ãŠãŒã¶ãŒã®ãã°ã€ã³ãæ
åœããŸã
- ãã°ã¢ãŠã-ãŠãŒã¶ãŒã®ãã°ã¢ãŠããæ
åœ
倿ŽãããLoginControllerã¯æ¬¡ã®ããã«ãªããŸãã
æåã®2ã€ã®ã¡ãœããã¯ãHTMLãã³ãã¬ãŒãããçæãããŸãã
store
ã¡ãœããã¯æ°ãããŠãŒã¶ãŒãããŒã¿ããŒã¹ã«ä¿åãã
POST
ä»ããŠ
Input::all()
ãã
Input::all()
ããã®ãã¹ãŠã®ããŒã¿ãåãå
¥ããŸãã ïŒ
詳现 ïŒã
Input
ã¯ã©ã¹ã«ã¯ãPOSTèŠæ±äžã«éä¿¡ãããããŒã¿ãå«ãŸããŸãã
all()
ã
get()
ã
has()
ããã³ãã®ä»ïŒ
Basic Input ïŒãªã©ã®éçã¡ãœããã倿°ãããŸãã
Hash
ã¯ãããŒã¿ããŒã¹å
ã®ãã¹ã¯ãŒããæå·åããã圢åŒã§ä¿åãããããã«ã
bcryptã¡ãœããã䜿çšããæå·åã¯ã©ã¹ã§ãïŒ
Laravel Security ïŒã
ãã ããç»é²ããåã«ãåä¿¡ããŒã¿ãæ€èšŒããå¿
èŠããããŸãã
ãã®ããã
Laravel
ã«ã¯
Validatorã¯ã©ã¹ããããŸãã
Validation::make
ã¡ãœããã¯ã2ã€ãŸãã¯3ã€ã®åŒæ°ãåããŸãã
$input
å¿
é ããã§ãã¯ããå
¥åã®é
å$rules
-å¿
é ãåä¿¡ããŒã¿ã®ã«ãŒã«ãå«ãé
å$messages
ãªãã·ã§ã³ããšã©ãŒã¡ãã»ãŒãžãå«ãé
å
å©çšå¯èœãªã«ãŒã«ã®å®å
šãªãªã¹ãã¯ãå©çš
å¯èœãªæ€èšŒã«ãŒã«ã«ãããŸãã
fails()
ã¡ãœããã¯ã
make
ã¡ãœããã«æž¡ããã«ãŒã«ã«åŸã£ãŠããŒã¿ãæ€èšŒããããã©ããã«å¿ããŠã
trueãŸãã¯
falseãè¿ã
ãŸã ã
Redirectã¯ã©ã¹ã¯ããªãã€ã¬ã¯ãã«äœ¿çšãããŸãã åœŒã®æ¹æ³ïŒ
- æ»ãïŒïŒ-èŠæ±ã®éä¿¡å
ã®ããŒãžã«ãªãã€ã¬ã¯ãããŸã
- æå³ããïŒããã©ãŒã«ããã¯ãïŒ-ãŠãŒã¶ãŒãèªèšŒãã£ã«ã¿ãŒã®äžã«ããããŒãžã«ãªãã€ã¬ã¯ãããååšããªãå Žåã¯ã
fallback
ã«æž¡ãããURLã«éä¿¡ããŸã - withInputïŒïŒ-å
¥åããäžæã»ãã·ã§ã³ã«ããŒã¿ã転éããŸã
- withErrorsïŒ$ããªããŒã¿ãŒïŒ-
$validator
$ errors $validator
ããŒã¿ã転éã$validator
ïŒïŒ $ errors倿°ã¯GETãªã¯ãšã¹ããå«ããã¹ãŠã®ããŒãžã§äœæããããããåžžã«ãã¹ãŠã®ããŒãžã§å©çšå¯èœã§ãïŒã - withïŒ 'variable'ã 'Your message here'ïŒ-æå®ããã¡ãã»ãŒãžãšãšãã«å€æ° 'variable'ãäžæã»ãã·ã§ã³ã«æž¡ããŸã
Auth
ã¯ã©ã¹ã¯æ¿èªã¯ã©ã¹ã§ãããããŒã¿ããŒã¹ããæå®ãããèå¥åïŒ
Authenticating Users ïŒã«ãã£ãŠãŠãŒã¶ãŒãæ¿èªãã
loginUsingId($id)
ãªã©ãããã€ãã®ã¡ãœããããããŸãã ç»é²åŸããŠãŒã¶ãŒãèªåçã«æ¿èªããããã䜿çšããŸãã
Controller
login()
ã®ã¡ãœããã¯ããŠãŒã¶ãŒã
email
ãŸãã¯
username
ã§èªèšŒããèªèšŒãã£ã«ã¿ãŒã®äžã«ããããŒãžã«ãªãã€ã¬ã¯ãããŸãã ããŒã¿ãäžèŽããªãå Žåãåä¿¡ããŒã¿ããšã©ãŒã¡ãã»ãŒãžããã¹ã¯ãŒããªãã§ãªãã€ã¬ã¯ãããŸãã
ãã®ãããæ¿èªãæ
åœããã³ã³ãããŒã©ãŒããããŸãã
ãã¹ãŠã®ãªãœãŒã¹ãã¢ã¯ã»ã¹ããé ãããã®æ¬¡ã®ã¹ãããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒããå«ã
app / routes.phpãã¡ã€ã«ã倿Žããããš
ã§ã ã
/ããŒã«ãªã©ã®ãªã³ã¯ããã©ããšã
/ loginããŒãžã«ãªãã€ã¬ã¯ããããŸã
"index.blade.php"
ããŒãžã«ã¯ããããŸã§æšæºããã¹ã
"index.blade.php"
ã®ã¿ã衚瀺ãããŸãã
Route::group(array('before' => 'admin.auth'))
ã§å²ãŸãããã¹ãŠã®ã«ãŒãã«å¯ŸããŠã
admin.authãã£ã«ã¿ãŒãé©çšããããŠãŒã¶ãŒãã²ã¹ãã§ãããã©ãããããã³-ãã°ã€ã³ããŒãžã«éä¿¡ããŸãã
ããã§ãã£ã«ã¿ã«ã€ããŠããããŠã«ãŒãã®ã°ã«ãŒãåã«ã€ããŠ
ããã§èªãããšãã§ã
ãŸã ã å¥ã®ãã£ã«ã¿ãŒ
Route::group(array('before' => 'un_auth'))
ã¯ããŠãŒã¶ãŒããµã€ãã«ãã°ãªã³ããŠãããã©ããã確èªããæ€èšŒãå®äºããããã°ãªãããŸãã
éåžžã®æäœã§ã¯ããã°ã€ã³ãã¡ã€ã«ãšç»é²ãã¡ã€ã«ã倿ŽããŸãã
// app/views/login/index.blade.php @extends('layouts.scaffold') @section('main') <h1>Login</h1> <p>{{ link_to_route('login.register', 'Register') }}</p> {{ Form::open(array('route' => 'login.index')) }} <ul> <li> {{ Form::label('email', 'Email or Username:') }} {{ Form::text('email') }} </li> <li> {{ Form::label('password', 'Password:') }} {{ Form::password('password') }} </li> <li> {{ Form::submit('Submit', array('class' => 'btn btn-info')) }} </li> </ul> {{ Form::close() }} @include('partials.errors', $errors) @stop // app/views/login/register.blade.php @extends('layouts.scaffold') @section('main') <h1>Register</h1> <p>{{ link_to_route('login.index', 'Login') }}</p> {{ Form::open(array('route' => 'login.register')) }} <ul> <li> {{ Form::label('email', 'Email:') }} {{ Form::text('email') }} </li> <li> {{ Form::label('username', 'Username:') }} {{ Form::text('username') }} </li> <li> {{ Form::label('password', 'Password:') }} {{ Form::password('password') }} </li> <li> {{ Form::submit('Submit', array('class' => 'btn btn-info')) }} </li> </ul> {{ Form::close() }} @include('partials.errors', $errors) @stop // app/views/login/dashboard.blade.php @extends('layouts.scaffold') @section('main') <h1>Administrative Dashboard</h1> <p>Nice to see you, <b>{{{ Auth::user()->username }}}</b></p> @stop // app/views/partials/errors.blade.php @if ($errors->any()) <ul> {{ implode('', $errors->all('<li class="error">:message</li>')) }} </ul> @endif
ãæ°ã¥ãã®ããã«ãããã§ã¯
@include('view', $variable)
ãã³ãã¬ãŒã
@include('view', $variable)
æ°ããããªãã¯ã䜿çšããŸããã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãéåžžã«ç°¡åã§ã-2ã€ã®åŒæ°ãæž¡ããŸãã
- view-ç¹å®ã®ãã³ãã¬ãŒãã«å«ãŸãããã³ãã¬ãŒã
- $ variable-ãã³ãã¬ãŒããã¬ã³ããªã³ã°ããããã«æž¡ãå¿
èŠããã倿°
ãµã€ãã«ç»é²ããŠããµã€ãã«ã¢ã¯ã»ã¹ããŸããããŠãä»ããªãã¯ãªãœãŒã¹ãè¡ãããšãã§ããŸããéœåžããå§ããŸãããããŸããModelã®City
æ€èšŒã«ãŒã«ã倿ŽããŸãïŒ
ããã¯åæ§ã«ããŠã¢ãã«æ€èšŒã«ãŒã«ã倿ŽããåŸã Company
ãRole
ãšTag
ïŒ
ãªã³ã¯ã®åãæ¿ãã®å©äŸ¿æ§ã®ããã«ãapp / views / layouts / scaffold.blade.phpã«ã¡ãã¥ãŒã远å ããå°æ¥ã®ããŒãºã«åãããŠjQueryãšjQuery-UIã远å ããŸã // app/views/layouts/scaffold.blade.php <!doctype html> <html> <head> <meta charset="utf-8"> <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet"> <link href="//code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" rel="stylesheet"> <style> table form { margin-bottom: 0; } form ul { margin-left: 0; list-style: none; } .error { color: red; font-style: italic; } body { padding-top: 20px; } input, textarea, .uneditable-input {width: 50%; min-width: 200px;} </style> @yield('styles') </head> <body> <div class="container"> <ul class="nav nav-pills"> <li>{{ link_to_route('offers.index', 'Offers') }}</li> <li>{{ link_to_route('tags.index', 'Tags') }}</li> <li>{{ link_to_route('roles.index', 'Roles') }}</li> <li>{{ link_to_route('cities.index', 'Cities') }}</li> <li>{{ link_to_route('comments.index', 'Comments') }}</li> <li>{{ link_to_route('companies.index', 'Companies') }}</li> <li class="pull-right">{{ link_to_route('login.logout', 'Logout') }}</li> </ul> @if (Session::has('message')) <div class="flash alert"> <p>{{ Session::get('message') }}</p> </div> @endif @yield('main') </div> <script type="text/javascript" src="//code.jquery.com/jquery.min.js"></script> <script type="text/javascript" src="//code.jquery.com/ui/1.10.3/jquery-ui.min.js"></script> @yield('scripts') </body> </html>
次ã«ãã¢ãã«ã®æ€èšŒã«ãŒã«ãç·šéããŸãOffer
ã
ããã§ã¯ãåçãã¢ããããŒãimage
ããææ®µAJAX
ã䜿çšãããµãŒããŒäžã®åçãžã®ãã¹ã®ã¿ãæ€èšŒèªäœã«è»¢éããå¿
èŠãããããããã£ãŒã«ãã«è€éãªãã¿ãŒã³ã䜿çšããŸãããããã§ã¯ããã³ãã¬ãŒãã¢ããª/ views / offers / create.blade.phpã倿Žããã¹ã¯ãªããçšã®å¥ã®ãã¡ã€ã«ãäœæããããšããå§ããŸãããã // app/views/offers/create.blade.php ... {{ Form::label('file', 'Image:') }} {{ Form::file('file')}} <img src="" id="thumb" style="max-width:300px; max-height: 200px; display: block;"> {{ Form::hidden('image') }} <div class="error"></div> ... @section('scripts') @include('offers.scripts') @stop // app/views/offers/scripts.blade.php <script> $(document).ready(function(){ </script>
ããã§ã¯ãæŒããŠç»åã远å ããinput[name="file"]
ãšã䜿çšããŠãããéä¿¡ããAJAX
ã«ã¯URL
/ã¢ããããŒãããã®URLããã®å¿çã¯ãããŠã³ããŒãããç»åãžã®ãªã³ã¯ã«ãªããŸãããã®ãªã³ã¯ã#thumbç»åã®src屿§ã«æ¿å
¥ããé衚瀺ã®å
¥åã«ä¿åããŸãimage
ãæ¬¡ã«ãapp / routes.phpãã¡ã€ã«ã«marshout ã远å ããå¿
èŠããããŸãupload
ã
ããŠãURLãç»é²ããŸããHomeController
ãããžãã¯ãã«ç»é²ããã®ã¯æ®ããŸãããããè¡ãã«ã¯ãapp / controllers / HomeController.phpãã¡ã€ã«ã«uploadOfferImage
min ã¡ãœããã远å ããŸãïŒ
ã«ãŒã«ãæ€èšŒããšã©ãŒãåçãªã©ããã¹ãŠãéåžžã«ç°¡åã§ããæåã«ä¿åããããã«ãä¿åãããã©ã«ããèšå®ããŸã-ããã¯public_pathïŒïŒ/ images /çŸåšã®å¹Ž/æ/æ¥ä»/ïŒpublic_path()
ããã¯Laravel
ãããªãã¯ãã¡ã€ã«ãžã®ãã¹ã®è£å©é¢æ°ã§ãïŒããããŠstr_random(30)
30æåã®ã©ã³ãã ãªãã¡ã€ã«åãäœæããæ¡åŒµåjpg
ããã®åŸãã¯ã©ã¹Input
ãšãã®ã¡ãœããã䜿çšãfile('file')->move('destination_path', 'filename')
ãŸãããfileãã¯çä¿¡ãã¡ã€ã«ããdestination_pathãã¯ãã¡ã€ã«ã®ç§»åå
ãã©ã«ããŒããfilenameãã¯ä¿åãããã¡ã€ã«ã®ååã§ããResponse::json
圢åŒã§çããäžããã§ãããjson
ããããïŒ
ãã¡ã€ã«ã¯ã§èªã¿èŸŒãŸãAJAX
ãŸãã
次ã®ã¹ãããã¯å€æŽã«ãªãForm::input('number', 'city_id')
ãšãForm::input('number', 'company_id')
å®éã®ããŒã¿ãšSELECTAã§ã
éžæãã©ã®ããã«æ©èœãããã¯ããã©ãŒã ãšHTMLïŒããããããŠã³ãªã¹ãïŒã§ç¢ºèªã§ããŸãããããã£ãŠãããŒã¿ããŒã¹å
ã®æ¢åã®éœåžãäŒæ¥ããéžæã§ããŸãããŸã äžè¶³ããŠããã®ã¯ãå²åŒã«ã¿ã°ã远å ããããšã§ããããã§ããªãŒãã³ã³ããªãŒããåããjquery-uiã¯ãè€æ°ã®å€ã远å ããã®ã«åœ¹ç«ã¡ãŸãããããè¡ãã«ã¯ãã¹ã¯ãªããapp / views / offers / create.blade.phpã§ãã¡ã€ã«ãå±éããŸãïŒ // app/views/offers/scripts.blade.php <script> $(document).ready(function(){ ... function split( val ) { return val.split( /,\s*/ ); } function extractLast( term ) { return split( term ).pop(); } $( "#tags" ) </script>
ããã¯jqueryui.comã®æšæºçãªäœ¿çšäŸã§ããããµãŒããŒããã®å¿çãã€ã³ãã§ãããã«å€æŽãããŠããŸããã芧ã®ãšãããã¢ãã¬ã¹ã¯ã«ç§»åã/tags
ãŸããç§ãã¡ã¯ããã®AJAX
èŠæ±ãžã®å¿çã®è«çãçµç¹ãURL
ãŸãã
ãããããã®ã¯ãè¿ããããšEloquent
ãã©ãŒãããã«å€æããããããjson
䜿çšããå¿
èŠããªãããšResponse::json()
ã§ãããããŠãããã«ãªãŒãã³ã³ããªãŒãã¿ã°ããããŸããæåŸã«è¡ãå¿
èŠãããã®ã¯ãå²åŒãäœæããããã®ããžãã¯ã倿Žããããšã§ãã
æåã«ãå²åŒãææ¥ããæ©ããªãã1ãæåŸã«é
ãçµäºããããã«ãæéåãã«ãŒã«ãæ¡åŒµããŸããæ¬¡ã«ãid
å¥ã®é
åå
ã®ãã¹ãŠã®ã¿ã°ãéžæããããŒã¿ããŒã¹å
ã®ã¿ã°ã®ååšã確èªããŸããæ¬¡ã«ãã¿ã°ãå
¥åãããŠãããã©ããã確èªããå°ããªãã§ãã¯ããããŸãããããŠæåŸã«ãéåžžã«è峿·±ãããªãã¯ïŒEloquentã§ã¯ãããŒãã«ããªã³ã¯ããããã«ç°ãªããªã¬ãŒã·ã§ã³ïŒEloquent RelationshipsïŒã䜿çšã§ããŸããããšãã°ãOffersã¢ãã«ã«ã¯å€ãã®ã¿ã°ãå«ããããšãã§ããããã«å¿ããŠModelã«èšè¿°ããŸã
ãããã£ãŠãoffersããŒãã«ã®1ã€ã®ã¬ã³ãŒããštagsããŒãã«ã®å€ãã®ã¬ã³ãŒãã®éã«é¢ä¿ãäœæããŸãããã¡ãœãããåç
§ãã$offer->tags()
ãšãç¹å®ã®å²åŒã«é¢é£ä»ããããŠãããã¹ãŠã®ã¿ã°ãååŸã§ããŸãããã ãããã®äŸã§ã¯ãäžéããŒãã«ãæäœããããã®ç¹å¥ãªã¡ãœããã䜿çšããŠãsync(array(1, 2, 3))
ãŸããããã¯ãäžéããŒãã«ã®offer_id
å¿
èŠãªããŒãã«ã«æžã蟌ã¿ãŸãtag_id
ã衚offer_tagïŒ
æã
ã¯ãŸããããŒãã«å
ã®ã¬ã³ãŒãéã®ãªã³ã¯ãæå®ããå¿
èŠãç³ãåºããŒãã«ã§ã¬ã³ãŒãã®éœåžãšäŒæ¥ïŒ
ãã¡ã€ã«ã¢ããª/ãã¥ãŒ/ãªãã¡ãŒ/index.blade.phpã倿Žããããã«æ®ã£ãŠããŸã // app/views/offers/index.blade.php @if ($offers->count()) <table class="table table-striped table-bordered"> <thead> <tr> <th>Title</th> <th>Description</th> <th>City</th> <th>Company</th> <th>Off</th> <th>Image</th> <th>Tags</th> <th>Expires</th> </tr> </thead> <tbody> @foreach ($offers as $offer) <tr> <td>{{{ $offer->title }}}</td> <td>{{ $offer->webDescription(array('shorten' => true, 'length' => 60)) }}</td> <td>{{{ $offer->city->name }}}</td> <td>{{{ $offer->company->name }}}</td> <td>{{{ $offer->off }}}</td> <td><img src="" style="max-width: 200px; max-height:150px;"></td> <td> @foreach($offer->tags as $tag) <span class="badge">{{{$tag->name}}}</span> @endforeach </td> <td>{{{ $offer->expires }}}</td> <td> {{ link_to_route('offers.edit', 'Edit', array($offer->id), array('class' => 'btn btn-info')) }} </td> <td> {{ Form::open(array('method' => 'DELETE', 'route' => array('offers.destroy', $offer->id))) }} {{ Form::submit('Delete', array('class' => 'btn btn-danger')) }} {{ Form::close() }} </td> </tr> @endforeach </tbody> </table> @else There are no offers @endif
ãããŠãå²åŒã®æ§é ãå®å
šã«åæ ããçŽ æŽãããåçãèŠãããšãã§ããŸãã
{{{ $string }}} $string , htmlentities
, , XSS. <?php echo htmlentities($string); ?>
Laravel
e($string)
app/views/offers/edit.blade.php ,
app/views/offers/show.blade.php update
app/controllers/OfferController.php .
app/views/edit.blade.php // app/views/offers/edit.blade.php @extends('layouts.scaffold') @section('main') <h1>Edit Offer</h1> {{ Form::model($offer, array('method' => 'PATCH', 'route' => array('offers.update', $offer->id))) }} <ul> <li> {{ Form::label('title', 'Title:') }} {{ Form::text('title') }} </li> <li> {{ Form::label('description', 'Description:') }} {{ Form::textarea('description') }} </li> <?php $cities = array(0 => 'Choose city'); foreach (City::get(array('id', 'name')) as $city) { $cities[$city->id] = $city->name; } ?> <li> {{ Form::label('city_id', 'City_id:') }} {{ Form::select('city_id', $cities) }} </li> <?php $companies = array(0 => 'Choose company'); foreach (Company::get(array('id', 'name')) as $company) { $companies[$company->id] = $company->name; } ?> <li> {{ Form::label('company_id', 'Company_id:') }} {{ Form::select('company_id', $companies) }} </li> <li> {{ Form::label('off', 'Off:') }} {{ Form::input('number', 'off') }} </li> <li> {{ Form::label('file', 'Image:') }} {{ Form::file('file')}} <img src="" id="thumb" style="max-width:300px; max-height: 200px; display:block; "> {{ Form::hidden('image') }} <div class="error"></div> </li> <li> {{ Form::label('expires', 'Expires:') }} {{ Form::text('expires') }} </li> <li> {{ Form::label('tags', 'Tags:') }} {{ Form::text('tags', Input::old('tags', implode(', ', array_fetch($offer->tags()->get(array('name'))->toArray(), 'name')))) }} </li> <li> {{ Form::submit('Update', array('class' => 'btn btn-info')) }} {{ link_to_route('offers.show', 'Cancel', $offer->id, array('class' => 'btn')) }} </li> </ul> {{ Form::close() }} @if ($errors->any()) <ul> {{ implode('', $errors->all('<li class="error">:message</li>')) }} </ul> @endif @stop @section('scripts') @include('offers.scripts') @stop
app/views/offers/create.blade.php ,
{{ Form::text('tags', ... }}
. : â , â
image
.
Form::text('tags', ... )
, , ,
$offer->tags()
name
.
Laravel
array_fetch , , , .
update
OfferController
:
addã¡ãœãããšã®éãã¯æå°éã§ããééã£ããã®ãæå®ãããå Žåãæåã«404ãšã©ãŒãã¹ããŒããid
次ã«ã¡ãœããã䜿çšãupdate($id)
ãŸããããããã¹ãŠã®å€æŽã§ããæ¬¡ã«ããã¡ã€ã«app / views / offers / show.blade.phpã倿ŽããŸãïŒ // app/views/offers/show.blade.php ... <thead> <tr> <th>Title</th> <th>Description</th> <th>City_id</th> <th>Company_id</th> <th>Off</th> <th>Image</th> <th>Tags</th> <th>Expires</th> </tr> </thead> <tbody> <tr> <td>{{{ $offer->title }}}</td> <td>{{ $offer->webDescription(array('shorten' => true, 'length' => 60)) }}</td> <td>{{{ $offer->city->name }}}</td> <td>{{{ $offer->company->name }}}</td> <td>{{{ $offer->off }}}</td> <td><img src="" style="max-width: 200px; max-height:150px;"/></td> <td> @foreach($offer->tags as $tag) <span class="badge">{{{ $tag->name }}}</span> @endforeach </td> <td>{{{ $offer->expires }}}</td> ...
ä»ãå²åŒã倿ŽããåŸãç»åãšãã¹ãŠã®ãªã¬ãŒã·ã§ãã«ããŒã¿ã§ãã®æ§é ãçŸãã衚瀺ããŸããããŒã ããŒãž
æåŸã«ããµã€ãã®ã¡ã€ã³ããŒãžãäœæããŸãããŸããæ°ãããã®ãäœæããŸãlayout
ã // app/views/layouts/main.blade.php <!doctype html> <html> <head> <meta charset="utf-8"> <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="{{ asset('css/main.css') }}"> @yield('styles') </head> <body> <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> <a class="brand" href="{{ route('home') }}">Habr Offers</a> <ul class="nav"> <li><a href="{{ route('home') }}">Home</a></li> </ul> </div> </div> </div> <div class="container"> @if (Session::has('message')) <div class="flash alert"> <p>{{ Session::get('message') }}</p> </div> @endif @yield('main') </div> <script type="text/javascript" src="//code.jquery.com/jquery.min.js"></script> <script type="text/javascript" src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script> @yield('scripts') </body> </html>
ãŸããã¹ã¿ã€ã«ã·ãŒãïŒ // public/css/main.css body {padding-top: 60px;} .no_decoration:hover, .no_decoration:focus {text-decoration: none;} .thumbnail .image-container {width: 100%; max-height: 200px; overflow: hidden;} .thumbnail .image-container img {min-width: 100%; min-height: 100%;} .thumbnail h3 {height: 40px; overflow: hidden;} .thumbnail .description {height: 100px; overflow: hidden;}
次ã«ãã¡ã€ã³ããŒãžã®ã«ãŒããåå®çŸ©ããŸãã
HomeController
äžè¶³ããŠããã¡ãœããã«è¿œå ãindex
ãŸãã
app / views / homeãã©ã«ããŒãäœæããããã«index.blade.phpãã¡ã€ã«ã远å ããapp / views / offersãã©ã«ããŒã«_preview.blade.phpãã¡ã€ã«ãäœæããŸã // app/views/home/index.blade.php @extends('layouts.main') @section('main') <h1>{{ $title }}</h1> @if ($offers->count()) @foreach ($offers as $key => $offer) @if($key % 3 == 0) <div class="row-fluid"> <ul class="thumbnails"> @endif <li class="span4"> <div class="thumbnail"> @include('offers._preview', $offer) </div> </li> @if($key % 3 == 2 || $key == count($offers) - 1) </ul> </div> @endif @endforeach @else There are no offers @endif @stop // app/views/offers/_preview.blade.php <div class="image-container"> <img src=""> </div> <div class="caption"> <h3>{{{ $offer->title }}}</h3> <hr> <p class="description">{{ $offer->webDescription() }}</p> <hr> <p><span class="label label-important">{{{ $offer->off }}} % off</span></p> <p>Location: {{{ $offer->city->name }}}</p> <p>Offer by: {{{ $offer->company->name }}}</p> <p>Expires on: <span class="label label-warning">{{{ $offer->expires }}}</span></p> <p>Tags: @foreach($offer->tags as $tag) <span class="badge">{{{$tag->name}}}</span> @endforeach </p> </div>
次ã«ãã¿ã°ãéœåžãããã³äŒç€Ÿã«ããå²åŒæ€çŽ¢ã远å ããå¿
èŠããããŸãããããè¡ãã«ã¯ãããåŸã«app / routes.phpãã¡ã€ã«ã«3ã€ã®ã«ãŒãã远å ããŸãhome
ïŒ
äžè¶³ããŠããã¡ãœããã远å ããŸãHomeController
ïŒ
ãããã®ã¡ãœãããæ£ããåäœãããã«ã¯ãModels City
ã§é¢ä¿ãèšå®ããå¿
èŠãCompany
ããTag
ãŸãã
ãã®ãã¹ãŠãåçããã«ã¯ããã¡ã€ã«app / views / offers / _preview.blade.phpã倿Žãããªã³ã¯ã远å ããŸãïŒ // app/views/offers/_preview.blade.php <a class="image-container" href="{{ route('home.offer', $offer->id) }}"> <img src=""> </a> <div class="caption"> <h3>{{{ $offer->title }}}</h3> <hr> <p class="description">{{ $offer->webDescription() }}</p> <hr> <p><span class="label label-important">{{{ $offer->off }}} % off</span></p> <p>Location: <a href="{{ route('home.by_city', $offer->city->name) }}">{{{ $offer->city->name }}}</a></p> <p>Offer by: <a href="{{ route('home.by_company', $offer->company->name) }}">{{{ $offer->company->name }}}</a></p> <p>Expires on: <span class="label label-warning">{{{ $offer->expires }}}</span></p> <p>Tags: @foreach($offer->tags as $tag) <a class="no_decoration" href="{{ route('home.by_tag', $tag->name) }}"> <span class="badge">{{{$tag->name}}}</span> </a> @endforeach </p> </div>
ã¯ãªãã¯ããŽãŒãå²åŒã¯åºæºã«åŸã£ãŠãœãŒããã衚瀺ãããŸããããã§ã¯ãå¥ã®å²åŒã衚瀺ãããã¬ãŒã³ããŒã·ã§ã³ãäœæããŸãããã // app/views/offers/_show.blade.php @extends('layouts.main') @section('main') <div class="page-header"> <h1> <span class="label label-important label-big">{{{ $offer->off }}}%</span> {{{ $offer->title }}} <small> by <a href="{{{ route('home.by_company', $offer->company->name) }}}">{{{ $offer->company->name }}}</a> </small> </h1> </div> <div class="pull-left image-container-big"> <img class="img-rounded" src="" alt="{{{ $offer->title }}}"> </div> <div class="description"> <p>{{ $offer->webDescription() }}</p> </div> <div class="clearfix"></div> <hr> <p>Location: <a href="{{ route('home.by_city', $offer->city->name) }}">{{{ $offer->city->name }}}</a> </p> <p>Tags: @foreach($offer->tags as $tag) <a class="no_decoration" href="{{ route('home.by_tag', $tag->name) }}"> <span class="badge">{{{$tag->name}}}</span> </a> @endforeach </p> <hr> <div class="page-header"> <h3>User's comments <small>leave and yours one</small></h3> </div> {{ Form::open() }} {{ Form::textarea('body', Input::old('body'), array('class' => 'input-block-level', 'style' => 'resize: vertical;'))}} <div class="input-append"> {{ Form::select('mark', array(0 => 5, 1 => 4, 2 => 3, 3 => 2, 4 => 1), Input::old('mark', 0)) }} {{ Form::submit('Comment', array('class' => 'btn btn-success', 'style' => 'clear: both;')) }} </div> {{ Form::close() }} @include('partials.errors', $errors) @stop // public/css/main.css body {padding-top: 60px;} .error {color: red;} .no_decoration:hover, .no_decoration:focus {text-decoration: none;} .thumbnail .image-container {width: 100%; max-height: 200px; overflow: hidden; display: block;} .thumbnail .image-container img {min-width: 100%; min-height: 100%;} .thumbnail h3 {height: 40px; overflow: hidden;} .thumbnail .description {height: 100px; overflow: hidden;} .image-container-big {width: 500px; height: 300px; margin: 0 20px 20px 0; text-align: center;} .image-container-big img {max-height: 300px; margin: 0 auto;} .label.label-big {font-size: 32px; line-height: 1.5em; padding: 0 15px; margin-bottom: 5px;}
å²åŒãå®å
šã«è¡šç€ºã§ããããã«ããããã«ãã«ãŒããšã¡ãœããã远å ããæåŸã«ã³ã¡ã³ããã©ãŒã ã远å ããŸããããã®æ©èœã®ããã«ãç®çã®ã³ã³ãããŒã©ãŒã«ã«ãŒããšã¡ãœããã远å ããå¿
èŠããããŸãã
ãã¹ãŠãé çªã«åŠçããŸãããã- å²åŒã®ãã¬ãŒã³ããŒã·ã§ã³ã§ã¯ãåé¡ããªãããšãé¡ã£ãŠããŸã-ããã¯åãã¬ã€ã¢ãŠã+ãã³ãã¬ãŒããšã³ãžã³ã§ãã
- ã«ãŒãã§ã¯ããã¹ãŠãåçŽã§ã以åãšåæ§ã«ãã¹ãŠãåãã§ãããªã³ã¯ã¯ã
Route::post('/offer_{id}'...)
æ¿èªãªãã§ã«ã¹ã¿ã ã¡ãã»ãŒãžãçæããæ°ãããã£ã«ã¿ãŒã䜿çšããããšãé€ããŠãã³ã³ãããŒã©ãŒ@ã¡ãœããã§ãã showOffer($id)
è€éã§ããããŸããã- . , ,
id
.
offers
. Offer
, comments
, , body
mark
+ ( ).
, ( contains() ), . â .
å²åŒããŒãžã«ã³ã¡ã³ãã衚瀺ããã«ã¯ããã¡ã€ã«app / views / offers / _show.blade.phpãå°ã倿ŽããŸã // app/views/offers/_show.blade.php ... @if(!$offer->usersComments->count()) <div class="well">You can be first to comment on this offer!</div> @endif @if(Auth::guest() || (!Auth::guest() && !$offer->usersComments->contains(Auth::user()->id))) {{ Form::open() }} {{ Form::textarea('body', Input::old('body'), array('class' => 'input-block-level', 'style' => 'resize: vertical;'))}} <div class="input-append"> {{ Form::select('mark', array(5 => 5, 4 => 4, 3 => 3, 2 => 2, 1 => 1), Input::old('mark', 5)) }} {{ Form::submit('Comment', array('class' => 'btn btn-success', 'style' => 'clear: both;')) }} </div> {{ Form::close() }} @include('partials.errors', $errors) @endif @foreach($offer->usersComments as $user) <div class="media"> <a class="pull-left" href="#"> <img class="media-object" data-src="holder.js/64x64"> </a> <div class="media-body"> <h4 class="media-heading">{{{ $user->username }}} <span class="label label-success">mark: {{{ $user->pivot->mark }}}</span></h4> <p class="muted">{{ str_replace("\r\n", '<br>', e($user->pivot->body)) }}</p> </div> </div> @endforeach @stop
ããã§ãå²åŒã®äžã§ããŠãŒã¶ãŒã¯ã³ã¡ã³ãã1ã€ãã€æ®ãããšãã§ãããŠãŒã¶ãŒãæ¢ã«ã³ã¡ã³ããæ®ããŠããå Žåããã©ãŒã ã¯è¡šç€ºãããŸãããæ¬¡ã®ã¹ãããã¯ããµã€ããžã®ã¢ã¯ã»ã¹æš©ãå²ãåœãŠãããšã§ããæåã«ããŠãŒã¶ãŒãšããŒã«ã®é¢ä¿ã瀺ããŸãã
次ã«ã管çããã«ã§ãŠãŒã¶ãŒããŒã«ç®¡çã远å ããŸãã
ã¢ãã«User
ã§ã¯ãããŒã«ãšã®é¢ä¿ã远å ããå¿
èŠãããããšã«æ³šæããŠãã ããã
ã³ã³ãããŒã©ãŒãäœæããŸãUserController
ã
app / views / usersãã©ã«ããŒãäœæããããã«3ã€ã®ãã¡ã€ã«ã远å ããŸãã // app/views/users/index.blade.php @extends('layouts.scaffold') @section('main') <h1>All Users</h1> @if ($users->count()) <table class="table table-striped table-bordered"> <thead> <tr> <th>Username</th> <th>Email</th> <th>Roles</th> </tr> </thead> <tbody> @foreach ($users as $user) <tr> <td>{{{ $user->username }}}</td> <td>{{{ $user->email }}}</td> <td> @foreach($user->roles as $role) <span class="badge">{{{$role->role}}}</span> @endforeach </td> <td>{{ link_to_route('users.edit', 'Edit', array($user->id), array('class' => 'btn btn-info')) }}</td> <td> {{ Form::open(array('method' => 'DELETE', 'route' => array('users.destroy', $user->id))) }} {{ Form::submit('Delete', array('class' => 'btn btn-danger')) }} {{ Form::close() }} </td> </tr> @endforeach </tbody> </table> @else There are no users @endif @stop // app/views/users/show.blade.php @extends('layouts.scaffold') @section('main') <h1>Show User</h1> <p>{{ link_to_route('users.index', 'Return to all users') }}</p> <table class="table table-striped table-bordered"> <thead> <tr> <th>Username</th> <th>Email</th> <th>Roles</th> </tr> </thead> <tbody> <tr> <td>{{{ $user->username }}}</td> <td>{{{ $user->email }}}</td> <td> @foreach($user->roles as $role) <span class="badge">{{{ $role->role }}}</span> @endforeach </td> <td>{{ link_to_route('users.edit', 'Edit', array($user->id), array('class' => 'btn btn-info')) }}</td> <td> {{ Form::open(array('method' => 'DELETE', 'route' => array('users.destroy', $user->id))) }} {{ Form::submit('Delete', array('class' => 'btn btn-danger')) }} {{ Form::close() }} </td> </tr> </tbody> </table> @stop // app/views/users/edit.blade.php @extends('layouts.scaffold') @section('main') <h1>Edit User</h1> {{ Form::model($user, array('method' => 'PATCH', 'route' => array('users.update', $user->id))) }} <ul> <li> {{ Form::label('username', 'Username:') }} {{ Form::text('username', $user->username, array('disabled')) }} </li> <li> {{ Form::label('email', 'Email:') }} {{ Form::text('email', $user->email, array('disabled')) }} </li> <li> {{ Form::label('roles', 'Roles:') }} {{ Form::text('roles', Input::old('roles', implode(', ', array_fetch($user->roles()->get(array('role'))->toArray(), 'role')))) }} </li> <li> {{ Form::submit('Update', array('class' => 'btn btn-info')) }} {{ link_to_route('users.show', 'Cancel', $user->id, array('class' => 'btn')) }} </li> </ul> {{ Form::close() }} @if ($errors->any()) <ul> {{ implode('', $errors->all('<li class="error">:message</li>')) }} </ul> @endif @stop @section('scripts') <script> $(document).ready(function(){ function split( val ) { return val.split( /,\s*/ ); } function extractLast( term ) { return split( term ).pop(); } $( "#roles" ) </script> @stop
ãŸããå°ãmetd index
ã³ã³ãããŒã©ãŒã倿ŽããŸãRolesController
... public function index() { $roles = $this->role->all(); if (Request::ajax()) { $roles = Role::where('role', 'like', '%'.Input::get('term', '').'%')->get(array('id', 'role')); return $roles; } return View::make('roles.index', compact('roles')); } ...
èªåè£å®ãæ©èœããããã«ãªããŸãããããã«ãççŸããªãããã«ããã¹ãŠã®ç§»è¡ãããŒã«ããã¯ãããããæäŸããåªããããŒã«ã䜿çšããŸãLaravel
-ããã¯DatabaseSeederã§ããããã䜿çšããŠãããŒã¿ããŒã¹ã«äœããã®æ§æãå
¥åããããããŒã¿ãéå§/ãã¹ããããã§ããŸãããããè¡ãã«ã¯ããŸãapp / database / seedsUsersTableSeeder
ãã©ã«ããŒã«ã¯ã©ã¹ãäœæããŸãïŒ
ããžãã¯ã¯æ¬¡ã®ãšããã§ããããŒãã«ãã¯ãªã¢ããããŒã¿ã®é
åãäœæããŠãããŒã¿ããŒã¹ã«æ¿å
¥ããŸããåãããšãããŸãããRolesTableSeeder
ïŒ
ããã§ãããŒã«manager
ã远å moderator
ãããããã®ããŒã«ãæã€ãŠãŒã¶ãŒã«ç®¡çããã«ã®åã
ã®ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãæäŸããŸããæ¬¡ã«ãå¥ã®ã¯ã©ã¹ãäœæããŸãSeeder
ã
ãããã£ãŠãããŒã«ãadmin
æåã®ãŠãŒã¶ãŒã«è¿œå ããŸãããããŒã¿ããŒã¹ãã¯ãªã¢ããŠåæããŒã¿ãå
¥åããã«ã¯ããŸããã¡ã€ã«app / database / seeds / DatabaseSeeder.phpãæ¬¡ã®ããã«å€æŽããŸãã
ãããŠããã¹ãŠã®å€æŽãåãå
¥ããã«ã¯ãã³ã³ãœãŒã«ããã³ãã³ããå®è¡ããŸãïŒ/ workspace / php / habr / folderã«ãããŸãïŒïŒ php artisan migrate:refresh --seed
migrate:refresh
ãã¹ãŠã®ç§»è¡ãããŒã«ããã¯ããŠããå床éå§ããŸãããªãã·ã§ã³--seed
ã¯ãå®è¡ããå¿
èŠãããããšã瀺ããŸãDatabaseSeeder
ãæ¬¡ã«ãæš©å©ã«é¢ããããžãã¯ãæ§ç¯ããŸããã¢ãã«ã«å€æŽãå ããŸãUser
ã
次ã«ããµã€ãã䜿çšããæš©éã«äžèŽããããã«ãroutesãã¡ã€ã«ã倿ŽããŸãã
ãæ°ã¥ãã®ããã«ãã³ã¡ã³ãã«ãŒãã«è¿œå ã®ãã£ã«ã¿ãŒã远å ããŸããããããã£ãŠããµã€ãã®äžè¬ãŠãŒã¶ãŒä»¥å€ã¯èª°ãå²åŒã«é¢ããã³ã¡ã³ããæçš¿ã§ããŸããããŸããããã§ã¯ã«ãŒãã䜿çšãããŸããRoute::when()
-ããã¯ããããããã¿ãŒã³ãã£ã«ã¿ãŒã§ãããã³ãã¬ãŒãURL
ãæåã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããã£ã«ã¿ãŒã2çªç®HTTP
ã«é©çšãããã£ã«ã¿ãŒãé©çšããé
åã3çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããšãã§ããŸããã³ã³ãããŒã©ãŒã®ã¡ãœããã倿Žãlogin()
ãŸãLoginController
ã
ããã§ããµã€ãã«å
¥ããšãäžè¬ãŠãŒã¶ãŒã¯ã¡ã€ã³ããŒãžã«ãªãã€ã¬ã¯ãããã管çè
ããã«ã管çè
ãã¢ãã¬ãŒã¿ãŒããããŒãžã£ãŒããªãã€ã¬ã¯ããããŸãã管ççšã®ããã²ãŒã·ã§ã³ã¡ãã¥ãŒãå°ã倿ŽããŸãã // app/views/layouts/scaffold.blade.php @if(!Auth::guest()) <ul class="nav nav-pills"> @if(Auth::user()->isManager()) <li>{{ link_to_route('offers.index', 'Offers') }}</li> <li>{{ link_to_route('companies.index', 'Companies') }}</li> <li>{{ link_to_route('tags.index', 'Tags') }}</li> <li>{{ link_to_route('cities.index', 'Cities') }}</li> @endif @if(Auth::user()->isModerator()) <li>{{ link_to_route('comments.index', 'Comments') }}</li> @endif @if(Auth::user()->isAdmin()) <li>{{ link_to_route('roles.index', 'Roles') }}</li> <li>{{ link_to_route('users.index', 'Users') }}</li> @endif <li class="pull-right">{{ link_to_route('login.logout', 'Logout') }}</li> </ul> @endif
ãã°ããã-åããŒã«ã¯ãã¢ã¯ã»ã¹ã§ãããªãœãŒã¹ãèŠãããã«ãªããŸãããã¡ãŒã«
Webã¢ããªã±ãŒã·ã§ã³ã®éèŠãªåŽé¢ã¯ãã¡ãŒã«ã®éä¿¡ã§ããæçŽã®äœæã«Laravel
䜿çšSwiftMailer
ããŸãïŒLaravel MailïŒããŸããã¡ãŒã«ãéä¿¡ããããã®èšå®ãæ§æããå¿
èŠããããŸããæçŽãéä¿¡ããããã®ãã¢ãšããŠãç§ã¯ã®ã¢ã«ãŠã³ãã䜿çšãgmail
ãŸããããµãŒããŒããã¡ãŒã«ãéä¿¡ããæ©èœãæäŸãããµãŒãã¹ïŒPostmarkappãªã©ïŒã¯åºæ¬çã«äœ¿çšã§ããŸããã¡ãŒã«ã®ã»ããã¢ããïŒ
ãã®ãã©ã¡ãŒã¿ãŒpretend
ã¯ãã¡ãã»ãŒãžã®éä¿¡ãæ
åœããŸããtrueã«èšå®ãããŠããå Žåãã¡ãŒã«ã¯éä¿¡ãããŸããããéä¿¡ã¬ããŒãã¯ãµã€ãã®ãã°ïŒapp / storage / logsïŒã«ä¿åãããŸãããŸããç»é²äžã«ãŠãŒã¶ãŒã«ãŠã§ã«ã«ã ã¡ãŒã«ãéä¿¡ããå¿
èŠããããŸãããã®ãããapp / views / emailsãã©ã«ããŒã«ãã³ãã¬ãŒããäœæããŸãã // app/views/emails/welcome.blade.php <!DOCTYPE html> <html lang="en-US"> <head> <meta charset="utf-8"> </head> <body> <h1>Welcome to Habra Offers!</h1> <div> We are glad that you are interested in us, {{{ $username }}}! </div> </body> </html>
次ã«ãã¡ãœããã倿Žãstore()
ãŸãLoginController
ã
Mailã¯ã©ã¹ã¯ãã¡ãœããã䜿çšsend()
ããŠ3ã€ã®åŒæ°ãåãã¡ãŒã«ãéä¿¡ããŸãã- $ view-䜿çšãããã³ãã¬ãŒãïŒãŸãã¯2ã€ã®ãã³ãã¬ãŒãã®é
åãæåã¯htmlãã³ãã¬ãŒãã2çªç®ã¯ãã¬ãŒã³ããã¹ãïŒ
- $ data-ããŒããã³ãã¬ãŒãå
ã®å€æ°ã«ãªãããŒã¿ã®é
å
- $ã³ãŒã«ãã㯠-ã¡ãã»ãŒãžãã©ã¡ãŒã¿ãèšå®ããããã«èµ·åããã颿°
ãã ããå¿
èŠãªã®ã¯ãŠã§ã«ã«ã ã¬ã¿ãŒã ãã§ã¯ãããŸããããŠãŒã¶ãŒããã¹ã¯ãŒããå¿ããŠããããå埩ãããå Žåã¯ã©ããªããŸããïŒãããè¡ãã«Laravel
ã¯ããã¹ã¯ãŒããªãã€ã³ããšãªã»ãããæäŸããŸããå¿
èŠãªããšïŒ cd /workspace/php/habr php artisan auth:reminders php artisan migrate
ãã¹ã¯ãŒããå埩ããã«ã¯ãé»è©±ã§ååã§Password::remind(array('email' => $email))
ããããã¹ã¯ãŒãããªã»ããããããã®ãªã³ã¯ãèšèŒããã¡ãŒã«ãéä¿¡ãããŸãã2ã€ã®ãã³ãã¬ãŒããäœæããå¿
èŠããããŸãã- app / views / auth / remind.blade.php-ãã¹ã¯ãŒãå埩ã®ããã®ã¡ãŒã«ãéä¿¡ãã
// app/views/auth/remind.blade.php @extends('layouts.scaffold') @section('main') @if (Session::has('error')) <div class="alert alert-error"> {{ trans(Session::get('reason')) }} </div> @elseif (Session::has('success')) <div class="alert alert-success"> An e-mail with the password reset has been sent. </div> @endif <h1>Forgot your password?</h1> <p>{{ link_to_route('login.index', 'No') }}</p> {{ Form::open() }} <ul> <li> {{ Form::label('email', 'Your email')}} {{ Form::email('email') }} </li> <li> {{ Form::submit('Send reminder', array('class' => 'btn')) }} </li> </ul> {{ Form::close() }} @stop
- app / views / auth / reset.blade.php-ãã¹ã¯ãŒãå埩ãã©ãŒã
// app/views/auth/reset.blade.php @extends('layouts.scaffold') @section('main') @if (Session::has('error')) <div class="alert alert-error"> {{ trans(Session::get('reason')) }} </div> @endif <h1>Reset your password</h1> {{ Form::open() }} {{ Form::hidden('token', $token) }} <ul> <li> {{ Form::label('email', 'Email')}} {{ Form::email('email', Input::old('email')) }} </li> <li> {{Form::label('password', 'New password')}} {{ Form::password('password')}} </li> <li> {{Form::label('password', 'New password confirmation')}} {{ Form::password('password_confirmation')}} </li> </ul> {{ Form::submit('Reset', array('class' => 'btn'))}} {{ Form::close() }} @stop
颿°trans()
ã¯ãæ§æããããŒã«ã©ã€ãºãããæååãåºåãããã«ããŒé¢æ°ã§ããapp / lang / ja / reminders.phpãã©ã«ããŒãèŠãŠã衚瀺ããããšã©ãŒã確èªããŠãã ãããããŒã«ã©ã€ãºããããšãã°ãã·ã¢èªã«å€æŽããã«ã¯ãapp / config / app.phpãã¡ã€ã«ã§ãã±ãŒã«å€ãenããruã«å€æŽããapp / lang / enãã©ã«ããŒã®ããã«ãã¡ã€ã«ãåäœæããapp / lang / ruãã©ã«ããŒã远å ããå¿
èŠããããŸãã
次ã«ã4ã€ã®ã«ãŒãã远å ããŸãã
埩æ§ã«åãæ¿ããã«ã¯ããã°ã€ã³ããŒãžã«ãªã³ã¯ã远å ããŸãã // app/views/login/index.blade.php ... {{ Form::close() }} <p>{{ link_to_route('password.remind', 'Forgot password?') }}</p> ...
ã§äžè¶³ããŠããã¡ãœãããšåæ§ã«LoginController
ïŒ
ããã§ããã¹ãŠã®ãŠãŒã¶ãŒããã¹ã¯ãŒãããªã»ããã§ããŸããå¥ã®ãªã³ã¯ã远å ããŠãã¡ã€ã³ããŒãžã®ãµã€ãã«å
¥åããŠç»é²ããŸãã // app/views/layouts/main.blade.php ... <a class="brand" href="{{ route('home') }}">Habr Offers</a> <ul class="nav"> <li><a href="{{ route('home') }}">Home</a></li> </ul> <div class="btn-group pull-right"> @if(Auth::guest()) <a href="{{ route('login.index') }}" class="btn">Login</a> <a href="{{ route('login.register') }}" class="btn">Register</a> @else <a href="{{ route('login.logout') }}" class="btn">Logout</a> @endif </div> ...
ãŸã çµäºããŠããªãå²åŒã®ã¿ã®ããŒãžã®åºåãå¶éããã«ã¯ãå¥ã®ã¡ãœãããModelã«è¿œå ããå¿
èŠããããŸãOffer
ã
ãããã£ãŠãæã
ã¯ãã®æ¹æ³ã§ã§ããHomeController@index
ã ãã®å€æŽOffer::orderBy('created_at', 'desc')->get()
ã§Offer::active()->sortLatest()->get()
ãæ°ããäœæããã¡ãœããã¯ãå¿
èŠãªæ¡ä»¶ãæ¡ä»¶ã®ãã§ãŒã³ã«è¿œå ããŸããã¿ã°ãéœåžãããã³äŒæ¥ã«ãããœãŒãæ¹æ³ã«ã€ããŠãåãããšãè¡ããŸãã
ããŒãžããŒã·ã§ã³
éèŠãªåŽé¢ã¯ããŒãžããŒã·ã§ã³ã§ããã¯ãããã¡ãããã¯ãšãªãããŒã¿ããŒã¹ã«éä¿¡ããæ°åè¡ã®åçãååŸãããããããã¹ãŠããŒãžã«ããã·ã¥ã§ããŸããããããããã¯ã»ãšãã©èª°ã®ã¢ãããŒãã§ããããŸãããããŒã¿ããŒã¹ããè¿ãããçµæã®æ°ãå¶éããã®ã¯éåžžã«ç°¡åã§ããã¯ãšãªã®æåŸpaginate()
ã«get()
ããŸãã¯ã®ä»£ããã«ã¡ãœããã䜿çšããå¿
èŠããããŸãall()
ãç°¡åãªäŸïŒ
ãããã£ãŠã1ããŒãžã«è¡šç€ºãããçµæã¯15ã®ã¿ã§ãããäžã«ããŒãžããã²ãŒã·ã§ã³ããããŸããçµæã®æ°ã¯ç°¡åã«å€æŽã§ãpaginate(1)
ãŸããããšãã°ãç®çã®æ°ãã¡ãœããã«æž¡ãã ãã§ããããšãã°ãããŒãžããšã«1ã€ã®çµæãè¿ããŸãã
è€éãªããšã¯äœããããŸããã䟿å®äžã管çããã«ã§ãåãæäœãè¡ããŸãã
ãµã€ãã«æåŸã«è¿œå ããã®ã¯ããŠãŒã¶ãŒãã³ã¡ã³ããæ®ããå²åŒã®ããŒãžããã³ããã¯ããŒã¯ã«ææ°ã®ã³ã¡ã³ãã衚瀺ããããšã§ããããŒãžãã¬ãŒã ã«ã³ã¡ã³ãã远å ããããšããå§ããŸãããã // app/views/layouts/main.blade.php <div class="container"> @if (Session::has('message')) <div class="flash alert"> {{ Session::get('message') }} </div> @endif <div class="row-fluid"> <div class="span3"> <h2>Last Comments</h2> @if (count($comments = Comment::take(5)->get()) > 0) @foreach ($comments as $comment) @include('partials.comment', $comment) @endforeach @else There are no comments yet @endif </div> <div class="span9"> @yield('main') </div> </div> </div>
ãŸãããã³ãã¬ãŒãèªäœãäœæããŸãcomment
ã // app/views/partials/comment.blade.php <div class="well"> <a href="{{ route('home.offer', $comment->offer_id) }}"> {{ $comment->user->username }} <span class="label label-success pull-right">mark: {{ $comment->mark }}</span> </a> <div>{{ $comment->webBody() }}</div> </div>
Model Comment
User
ãšOffer
ïŒã®éã«æ¥ç¶ã远å ããããšãå¿ããªãã§ãã ãã
åæ§ã«ãhtml-
ã³ã¡ã³ããæžãããŠåãé€ãè£å©æ©èœããããŸãããŠãŒã¶ãŒã«ããã¯ããŒã¯ã远å ããããšã¯æ®ããŸãïŒ
ãŸããapp / route.phpã«ã«ãŒãã远å ããæ¬¡ã«app / views / layouts / main.blade.phpã«ãªã³ã¯ã远å ããModel User
ãšã®éã®æ¥ç¶ãèšå®Offer
ããæåŸã«ã¡ãœãããå®è£
ãbookmarks
ãŸããHomeController
ãå±éãã
å±éã®æéãæ¥ãŸããïŒãã®ãããç§ã¯fortrabbit.comãéžæããŸãã -äžã®ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãã£ã³ã°PHP
ãããã¯ãµããŒãããŠããŸãGit
ãSSH
ãMemcached
ãComposer
ãMySQL
ããã³ãããããã§ã®ç»é²ããã»ã¹ã¯éåžžã«ç°¡åã§ãã
次ã«ãæ°ããã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
圌ã«é»è©±ããŸãããhabr
ããããžã§ã¯ãåã¯ãhabr.eu1.frbit.net /ãžã®ãªã³ã¯ã«ãªããŸããã¡ã¢ïŒHabra OffersïŒã远å ssh
ããè»ããããŒã远å ããŸããssh
ããŒã確èªããã«ã¯ãã¿ãŒããã«ã«å
¥åããŸãïŒ cat ~/.ssh/id_rsa.pub
æåŸã®ã¹ãããã¯ãç°å¢ã®æ§æãåŸ
ã€ããšã§ãããªããžããªãžã®ã¢ã¯ã»ã¹ã圢æããããšã«ãªãGit
ãSSH
ãšSFTP
ãMySQL
ã«ã¹ã¿ãã€ãºãšReSync
ã¢ã¯ã»ã¹ãç°å¢ã皌åããŠããŸãã
fortrabbit
éã¢ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ãããªãŒãºããŸããããã§ã¢ããªã±ãŒã·ã§ã³ã®åçµãè§£é€ããæ¹æ³ãèªãããšãã§ããŸããããã§ãã¢ããªã±ãŒã·ã§ã³ã«å
¥åããããfortrabbit
ã«ãã¿ãŒããã«ã«ç§»åããŸãã cd && cd workspace/php/ git clone git@git1.eu1.frbit.com:habr.git fort_habr
fortrabbit
'a ãå«ã空ã®ãªããžããªã®ã¯ããŒã³ãäœæãããŸããæ¬¡ã«ããããžã§ã¯ãå
šäœãã¯ãŒã¯ã¹ããŒã¹/ php / habrãã©ã«ããŒããã¯ãŒã¯ã¹ããŒã¹/ php / fort_habrãã©ã«ããŒã«è»¢éããŸããããŒã¿ããŒã¹æ§æãã¡ã€ã«ã«ç§»åããæ°ããããŒã¿ã§ä¿®æ£ããŸãMySQL
ãããã§ãã¢ããªã±ãŒã·ã§ã³ãã¢ããããŒãããæºåãã§ããŸããã cd fort_habr git add . git commit -am "Initial Commit" git push -u origin master
çµå±ã®ãšãããssh
ç§»è¡ãéå§ããŠç§»è¡ãéå§ããå¿
èŠããããŸããã ããïŒ
ssh u-habr@ssh1.eu1.frbit.com
次ã«ããã¹ã¯ãŒããå
¥åãããšããµãŒããŒäžã«ããŸããhtdocsãã©ã«ããŒã«ç§»åããŠã以äžãå®è¡ããŸãã cd htdocs php artisan migrate:install php artisan migrate --seed
ããŒã¿ããŒã¹èšå®ãæ£ããå Žå-åé¡ã¯çºçããŸããããã¹ãã£ã³ã°ãæäœããããComposer
ã«äœ¿çšããå¿
èŠãããããŸããssh
-ã³ãããã«ããªã¬ãŒã远å ããã ãã§ãïŒ git commit --allow-empty -am "Update dependencies [trigger:composer:update]" git push -u origin master
ãã®ãªãã·ã§ã³ã¯--allow-empty
ããã¡ã€ã«ã«å€æŽãå ããã«ã³ããããéå§ã§ããããã«ããããã®ãã®ã§ãã空ã®ã³ãããã®ããã«ãããããã³ã¡ã³ããèŠã[trigger:composer:update]
ãšããã¹ãã£ã³ã°ã¯èªåçã«ããŒã ãç«ã¡äžããcomposer update
ãã¹ãŠã®ãããžã§ã¯ãã®äŸåé¢ä¿ãæŽæ°ãããŸããã¡ãªã¿ã«ãGitHubã®ãªããžããªã«ã¯ãseeds
å²åŒã®ããã«åçã远å ããŸãããæåŸã«ããµã€ãã«ã¢ã¯ã»ã¹ããåã«Domains
ããµãŒããŒRoot Path
ã§valueãšäžèŽããããšã確èªããŠãã ããpublic
ãæ£ç¢ºã«ãã®ããã«é
眮ãããŠããã®ã§Laravel
ãããã§éã¶ããšãã§ããŸãïŒHabra Offersããããã«
èªãã§è峿·±ããããããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸããLaravel
-ããŸããŸãªè€éãã®Webã¢ããªã±ãŒã·ã§ã³ãéçºããããã®åªãããã¬ãŒã ã¯ãŒã¯ãç§ã説æããããšããäž»ãªããããŠããã«å€ãã®åŽé¢ããããŠèå³ã®ããã«å®¿é¡ãããŸãïŒ- ã¡ã€ã³ã¡ãã¥ãŒã«ãªã³ã¯ã远å ããŠã1é±éãŸãã¯1æ¥ä»¥å
ã«æéåãã«ãªããªãã¡ãŒã®ã¿ã衚瀺ã§ããããã«ããŸãã
- ã³ã¡ã³ããããã¯ã管çããã«ã«è¿œå ããŠãã³ã¡ã³ããªã¹ãã§é衚瀺ã«ããŸãã
- å²åŒã®è©äŸ¡æ°ïŒå¹³åè©äŸ¡ïŒã远å ããŸãã
- ã€ã¡ãŒãžç®¡çããã±ãŒãžã远å ããŸãã
- ãŠãŒã¶ãŒãã¢ãã¿ãŒãã¢ããããŒãããæ©èœã远å ããŸãã
WYSIWYG
管çããã«ã§ãšãã£ã¿ãŒã远å ããŸãã
ããããè¯ãä»äºã ãšæããŸããïŒèè
ã«ã€ããŠ
- ç§ã¯24æ³ãçµå©ããŠããŸãã
- æåã®äžäœïŒUEP "KROK"ãå°éåéïŒåœéçµæžåŠããã¹ã¿ãŒã
- çŸæç¹ã§ã¯ãå¿çšæ°åŠåŠéšã®NTUU KPIã®3幎çã§ããå°éåéïŒãœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°ã
- ç§ã¯ããŒãã¿ã€ã ã§15ãæéWebéçºè
ãšããŠåããŠããŸãã
Laravel
ããŒãžã§ã³3ããåŠãã§ããŸãã
çµ±èšåé
- éçºã«é¢ããèšäºãæžãã®ã«äžé±é匱ããããŸããã
- èšäºã«ã¯3040ãå«ãŸããŠããŸãè¡ããŠããŸãïŒããã¹ããšãã£ã¿ãŒå
ïŒã
- èšäºã«ã¯100500æåãå«ãŸããŠããŸãïŒããã¹ããšãã£ã¿ãŒïŒã
ãã¹ãŠã®ææ³ãšã©ãŒãPMã«æžããŠãã ãããæãã¿ã¯æ»ã¬ïŒãããæžãã«éããªãïŒãUPDïŒäŸ¿å©ãªãªã³ã¯