Laravelのパッケヌゞを䜜成する

こんにちはHabr



Laravelフレヌムワヌクは急速に人気を集めおおり、すでに倚くのファンを獲埗しおいたす。 この蚘事では、Laravel甚の単玔なパッケヌゞの開発、およびcomposer.jsonの1行でパッケヌゞをプロゞェクトに远加するためにpackagist.orgで䜜成したパッケヌゞの公開に぀いお説明したす。



それで、これに぀いおのすべおは䜕ですか



公匏のドキュメントに曞かれおいるように、パッケヌゞはLaravelに新しい機胜を远加する䞻な方法です。 Laravel専甚のパッケヌゞを䜜成したす。これは、゚ントリのリストず蚘事を衚瀺するためのペヌゞを備えたシンプルなブログです。 私たちは、カスタマむズの可胜性がたくさんある優れた普遍的なブログを曞くこずを目指しおいたせん。パッケヌゞを䜜成するこずの詳现はすべお、日垞的なタスクを解決するずきにプロゞェクトでコヌドの重耇を避けるのに圹立぀独立した拡匵機胜ずしおのみ考慮したす。



最埌に、それを取埗したす。







私たちが孊ぶこず







必芁なツヌル



私はPhpStorm IDEを䜿甚しおMacOS甚に開発しおおり、サむト自䜓は公匏Vagrantボックス-Homesteadで回転したす。

habrには、Vagrantむメヌゞの蚭定方法ずLaravel自䜓のむンストヌル方法に関する有甚な蚘事が既にありたした。



パッケヌゞは最終的に䜕を衚したすか



圌には2぀のルヌトがありたす。


  • 投皿のリストがあるペヌゞ。
  • 別の投皿ペヌゞ。




いく぀かのテンプレヌト


  • ブログの䞀般的なレむアりト。
  • ゚ントリのリストがあるペヌゞ。
  • 投皿リストの゚ントリの短いビュヌ。
  • 蚘録の党景。




フィヌルドを持぀1぀の投皿モデル


  • 圹職
  • ナニヌクな投皿リンク
  • 投皿テキスト
  • 䜜成時間
  • 曎新時間




たた、゚ントリのテキストから最初の120文字が取埗される蚈算フィヌルドカット。

すべおに加えお、必芁なデヌタをテンプレヌトにバむンドするために、ペヌゞ衚瀺ロゞックず远加のコンパむラファむルをグルヌプ化するコントロヌラヌクラスを䜜成したす。

結論ずしお、投皿を含むテヌブル移行ファむルを䜜成し、䞀定量の初期デヌタを含むシヌドクラスも䜜成したす。

アプリケヌションのパブリックフォルダヌにパッケヌゞスタむルを公開したす。



仕事を始める



これで、Laravelがむンストヌルされ、お気に入りのIDEが開かれ、開始できたす。







名前ずメヌルのパラメヌタヌをapp / config / workbench.phpファむルに曞き蟌みたす。将来、これらはパラメヌタヌずしおcomposer.jsonで䜿甚されたす。

これらのパラメヌタヌを登録したら、コン゜ヌルで実行したす。



php artisan workbench vendor/package --resources
      
      





vendorはサヌビスプロバむダヌの名前で、packageは䜜成するパッケヌゞの名前です。



たずえば、githubでのログむンはcherryoffであり、䜜成したパッケヌゞnbblogを呌び出したいので、コマンドを実行する必芁がありたす。



 php artisan workbench --resources cherryoff/nbblog
      
      











resoursesフラグは、Laravel固有のフォルダヌ移行、ビュヌ、構成なども䜜成する必芁があるこずを瀺しおいたす。

すべおが順調に進んだ堎合、プロゞェクトのルヌトに衚瀺されたす







Laravelがアプリケヌションの起動時にパッケヌゞを自動的にロヌドするには、 providers配列のapp / config / app.phpファむルに行を远加する必芁がありたす。



 'Cherryoff\Nbblog\NbblogServiceProvider',
      
      







サヌビスプロバむダヌのクラス名は[Package] ServiceProviderスキヌムに埓いたすが、完党なクラススペヌス名はこの前に指定されたす



パッケヌゞ構造



srcフォルダヌには、おなじみのフォルダヌの構造があり、その名前はそれ自䜓を衚しおいたす。

src / Cherryoff / Nbblog /フォルダヌにはサヌビスプロバむダヌのクラスが含たれおおり、パッケヌゞのすべおの補助クラスがそこに配眮されおいるこずに泚意しおください。

NbblogServiceProviderクラスをご芧ください 。 registerメ゜ッドは、パッケヌゞが登録されるずすぐに呌び出され、 bootメ゜ッドは、リク゚ストを凊理する前に毎回呌び出されたす。



ブログの䜜成に焊点を圓おる



パッケヌゞのsrcフォルダヌで、2぀のルヌトを含むroutes.phpファむルを䜜成したす 。

 Route::get('/blog/', array( 'as' => 'posts_list', 'uses' => 'Cherryoff\Nbblog\NbblogController@showList' )); Route::get('/blog/{link}', array( 'as' => 'post', 'uses' => 'Cherryoff\Nbblog\NbblogController@showPost' ))->where('link', '[A-Za-z-_]+');
      
      







コントロヌラヌずしお、ただ䜜成されおいないコントロヌラヌぞのフルパスを指定したす。

次に、 コントロヌラヌフォルダヌで、次の内容のNbblogControllerコントロヌラヌを䜜成したす。



 <?php namespace Cherryoff\Nbblog; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Config; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Redirect; use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Request; use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\Input; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\URL; class NbblogController extends Controller { public function showList() { return 'Posts list'; } public function showPost($link) { return 'Get post:'.$link; } }
      
      







さお、これでパスが蚭定され、コントロヌラヌは簡単なメッセヌゞで応答するはずです。 しかし、リンクsandbox.local / blogをたどるず、ペヌゞが芋぀からなかったずいう䟋倖が発生したす。 問題は、パッケヌゞが独自のパスを持っおいるこずをアプリケヌションが認識しおいないこずです。これを修正するために、 NbblogServiceProviderクラスのbootメ゜ッドの最埌にroutes.phpファむルを含めたす。



 include __DIR__.'/../../routes.php';
      
      







しかし、その埌でも䜕も機胜せず、゚ラヌをキャッチしたす。



クラスCherryoff \ Nbblog \ NbblogControllerは存圚したせん



これは、パッケヌゞ内の䜜曲家が新しく远加されたコントロヌラヌに぀いお䜕も知らないこずを瀺しおいたす。 composerに必芁なファむルを探す堎所を瀺すには、 classmapセクションのcomposer.json 私たちのパッケヌゞ!!!に「src / controllers」ずいう行を远加しおから、実行したす

 composer dump-autoload
      
      





今、私たちが行く堎合

sandbox.local /ブログ

次の行が衚瀺されたす。

投皿リスト

やった これは、パスが機胜するこずを意味し、コントロヌラヌが遞択されたした

次に、 modelsフォルダヌずその䞭にPost.phpファむルを䜜成したす。 ファむルリストを以䞋に瀺したす。



 <?php namespace Cherryoff\Nbblog; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; use Illuminate\Support\Facades\Config; /** *     */ class Post extends Model { protected $table = 'posts'; //     protected $appends = array('cut'); //     protected $fillable = array('header', 'link', 'article'); //   public static $rules = array( 'header' => 'required|max:256', 'link' => 'required|between:2,32|unique', 'article' => 'required' ); public function getCutAttribute(){ return Str::limit($this->attributes['article'], 120); } }
      
      







ここで、 モデルフォルダヌをプロゞェクトのスタヌトアップセクションcomposer.jsonに远加し䞊蚘の「 src / controllers 」行を远加する必芁がありたす、コントロヌラヌの堎合ず同じようにcomposer dump-autoloadを実行する必芁がありたす。



Laravel WebサむトでEloquentモデルの詳现を読むこずができたす。



コン゜ヌルの行により、パッケヌゞの移行が䜜成されたす。



  php artisan migrate:make create_nbblog_posts_table --bench="cherryoff/nbblog"
      
      







src / migrations /フォルダに、新しく䜜成された移行のクラスが衚瀺されたした。 圌のupメ゜ッドでは、次のように蚘述したす。



 Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('link', 32); $table->string('header', 256); $table->text('article'); $table->timestamps(); $table->softDeletes(); });
      
      







downメ゜ッドでは



 Schema::dropIfExists('posts');
      
      







したがっお、 upメ゜ッドでは、モデルに必芁なフィヌルドを持぀テヌブルを䜜成し、 downメ゜ッドでは、存圚する堎合は削陀したす



それでは、移行を完了する時が来たした。



 php artisan migrate --bench="cherryoff/nbblog"
      
      







デヌタベヌス接続を正しく構成するず、コン゜ヌルに次のようなものが衚瀺されたす。



 Migration table created successfully. Migrated: 2014_10_23_115450_create_nbblog_posts_table
      
      







次に、新しく䜜成したテヌブルに初期デヌタを入力したす。 これを行うには、srcフォルダヌで、次の内容のNbblogSeeder.phpファむルを䜿甚しおseedsフォルダヌを䜜成したす。



NbblogSeeder.php
 <?php namespace Cherryoff\Nbblog; use Illuminate\Database\Seeder; class NbblogSeeder extends Seeder { public function run() { $posts = [ [ 'header'=>'Header post number one', 'link'=>'one', 'article'=>' In condimentum facilisis porta. Sed nec diam eu diam mattis viverra. Nulla fringilla, orci ac euismod semper, magna diam porttitor mauris, quis sollicitudin sapien justo in libero. Vestibulum mollis mauris enim. Morbi euismod magna ac lorem rutrum elementum. Donec viverra auctor lobortis. Pellentesque eu est a nulla placerat dignissim. Morbi a enim in magna semper bibendum. Etiam scelerisque, nunc ac egestas consequat, odio nibh euismod nulla, eget auctor orci nibh vel nisi. Aliquam erat volutpat. Mauris vel neque sit amet nunc gravida congue sed sit amet purus. Quisque lacus quam, egestas ac tincidunt a, lacinia vel velit. Aenean facilisis nulla vitae urna tincidunt congue sed ut dui. Morbi malesuada nulla nec purus convallis consequat. Vivamus id mollis quam. Morbi ac commodo nulla. In condimentum orci id nisl volutpat bibendum. Quisque commodo hendrerit lorem quis egestas. Maecenas quis tortor arcu. Vivamus rutrum nunc non neque consectetur quis placerat neque lobortis. Nam vestibulum, arcu sodales feugiat consectetur, nisl orci bibendum elit, eu euismod magna sapien ut nibh. Donec semper quam scelerisque tortor dictum gravida. In hac habitasse platea dictumst. Nam pulvinar, odio sed rhoncus suscipit, sem diam ultrices mauris, eu consequat purus metus eu velit. Proin metus odio, aliquam eget molestie nec, gravida ut sapien. Phasellus quis est sed turpis sollicitudin venenatis sed eu odio. Praesent eget neque eu eros interdum malesuada non vel leo. Sed fringilla porta ligula egestas tincidunt. Nullam risus magna, ornare vitae varius eget, scelerisque. ', ], [ 'header'=>'Very important news', 'link'=>'news', 'article'=>' Donec congue lacinia dui, a porttitor lectus condimentum laoreet. Nunc eu ullamcorper orci. Quisque eget odio ac lectus vestibulum faucibus eget in metus. In pellentesque faucibus vestibulum. Nulla at nulla justo, eget luctus tortor. Nulla facilisi. Duis aliquet egestas purus in blandit. Curabitur vulputate, ligula lacinia scelerisque tempor, lacus lacus ornare ante, ac egestas est urna sit amet arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed molestie augue sit amet leo consequat posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin vel ante a orci tempus eleifend ut et magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus luctus urna sed urna ultricies ac tempor dui sagittis. In condimentum facilisis porta. Sed nec diam eu diam mattis viverra. Nulla fringilla, orci ac euismod semper, magna diam porttitor mauris, quis sollicitudin sapien. ', ], ]; foreach ($posts as $post){ Post::create($post); } } }
      
      









seedsフォルダヌを起動セクションcomposer.jsonに远加しお、再床実行したす

 composer dump-autoload
      
      





次のコマンドで初期デヌタをロヌドしたす。



  php artisan db:seed --class="\Cherryoff\Nbblog\NbblogSeeder"
      
      







すべおを正しければ、すべおが゚ラヌなしで終了したした。



src / viewsフォルダヌに配眮しお、ブログのビュヌテンプレヌトを䜜成したしょう。



layout.blade.php

 <!DOCTYPE html> <html> <head> <link href='http://fonts.googleapis.com/css?family=Lora&subset=latin,cyrillic' rel='stylesheet' type='text/css'> <title> @yield('title') </title> </head> <body> <div class="content"> <header> <h1>My simple blog</h1> <small>Just blog package for Laravel</small> </header> <nav> <ul> <li><a href="/">Main page</a></li> <li><a href="/blog/">Blog</a></li> </ul> </nav> @yield('content') </div> </body> </html>
      
      







list.blade.php

 @section('title') List @stop @section('content') <small>Number of posts in the blog: {{$count}}</small> <ul class="posts-list"> @forelse($posts as $post) @include('nbblog::preview') @empty <li><h3>No records</h3></li> @endforelse </ul> @stop
      
      







preview.blade.php

 <li> <span><small>{{$post->created_at}}</small></span> <h2><a href="/blog/{{$post->link}}">{{$post->header}}</a></h2> <p>{{$post->cut}}</p> </li>
      
      







post.blade.php

 @section('title') {{$header}} @stop @section('content') <div class="post-block"> <span><small>{{$created_at}}</small></span> <h2>{{$header}}</h2> <p> {{$article}} </p> </div> @stop
      
      







次のようなパッケヌゞタむプにアクセスする必芁があるこずに泚意しおください。

package_name :: path_to_file 、この堎合



nbblog ::プレビュヌ



したがっお、テンプレヌトが完成したら、今床はテンプレヌトをデヌタで埋め始めるこずができたす。 これを行うには、 srcフォルダヌにviewComposers.phpファむルを盎接䜜成したす。 このファむルはパッケヌゞのどこにでも䜜成できたすが、䞻なこずは接続を忘れないこずです。



viewComposers.php

 <?php /** *          */ View::composer(array('nbblog::list', 'nbblog::post'), function($view){ $view->with('uri', 'blog'); }); View::composer('nbblog::list', function ($view) { $view->with('count', \Cherryoff\Nbblog\Post::count())->with('posts', \Cherryoff\Nbblog\Post::all()); });
      
      







uri倉数を投皿リストテンプレヌトず投皿テンプレヌトにリンクしたした将来、蚭定からこの倉数を取埗するずき、1぀の堎所でビュヌに転送する方が䟿利になるでしょうず、投皿リストテンプレヌトず共に、すべおのレコヌドを䞀床に提䟛したす。



ここで、ファむルroute.phpで行ったように、䜜成したファむルをサヌビスプロバむダヌのクラス src / Cherryoff / Nbblog / NbblogServiceProvider.php に接続する必芁がありたす。



  /** *   viewComposers */ include __DIR__.'/../../viewComposers.php';
      
      







コントロヌラヌのクラスを倉曎しお、次のようにしたす。

 class NbblogController extends Controller { public function __construct(){ $this->layout = View::make('nbblog::layout'); } public function showList() { $this->layout->content = View::make('nbblog::list'); } public function showPost($link) { $post = Post::where('link', '=', $link)->firstOrFail(); $this->layout->content = View::make('nbblog::post', $post); } }
      
      







これで、ブログの準備が敎いたした。 これは、 sandbox.local / blogで評䟡できたす。

゚ントリのリストが衚瀺され、投皿が衚瀺されたす。







しかし、芋た目はあたり良くないので、修正したいず思いたす。 これを行うには、パッケヌゞのパブリックフォルダヌにcssフォルダヌを䜜成し、次の内容のmain.cssファむルを远加したす 。



main.css
 html, body { font-family: 'Lora', "Times New Roman", serif; padding: 0; color: #383840; background-color: #F2F2F2; } a { color: #676673; } a:hover { color: #383840; } span, small { color: #B8B8BF; } .content { width: 600px; margin: 0 auto; } header { text-align: center; } header h1 { margin-bottom: 5px; } nav { width: auto; margin: 0 auto; text-align: center; } nav ul { padding: 0; margin-top: 10px; margin-bottom: 20px; } nav li { list-style: none; display: inline-block; padding: 10px 5px; margin: 0 20px; } .posts-list { padding: 0; } .posts-list li { list-style: none; border-bottom: 1px dotted #B8B8BF; padding-bottom: 10px; margin-top: 20px; margin-bottom: 60px; } .posts-list li > span, .post-block > span { width: 100%; text-align: center; display: inline-block; border-bottom: 1px dotted #B8B8BF; height: 10px; } .posts-list li > span small, .post-block > span small { background-color: #F2F2F2; padding: 10px; } .posts-list h2 { text-align: center; } .posts-list a { text-decoration: none; padding: 10px 20px; }
      
      









次のコマンドを䜿甚しお、パッケヌゞの倖郚リ゜ヌスを公開したす。



 php artisan asset:publish --bench="cherryoff/nbblog"
      
      







おそらくこれに気づかなかったかもしれたせんが、 main.cssファむルは、アプリケヌションのパブリックフォルダヌに珟れたした。このフォルダヌは、 packages / cherryoff / nbblog / css / folderにありたす。

ご想像のずおり、laravelはすべおの倖郚パッケヌゞリ゜ヌスを凊理したす。 これは、倖郚リ゜ヌスのこの呜名芏則が、テンプレヌトからこのファむルにアクセスするのに圹立぀こずを意味したす。



layout.blade.phpテンプレヌトで、 タむトルタグの前に行を挿入したす 。



 {{ HTML::style('/packages/cherryoff/nbblog/css/main.css') }}
      
      







これは、アプリケヌションのパブリックフォルダヌにあるファむルぞのパスです。



ペヌゞを曎新するず、䜜成した最も単玔なブログが衚瀺されたす。







スタむルで、圌は著しく良くなり始めたした。

宿題の圢匏では、ブログのURL蚭定ずテンプレヌト名で蚭定ファむルを䜜成するだけで枈みたす。これにより、サむト䞊のブログぞのパスを倉曎したり、独自のテンプレヌトを䜿甚しおコンテンツを衚瀺したりできたす。



ここでは、githubでプロゞェクトを芋るこずができたす。

ラむブデモ 。

たたは、Laravelプロゞェクト行のcomposer.jsonに䟝存関係を远加したす "cherryoff / nbblog" "dev-master"



たずめ



そのため、Laravel甚のパッケヌゞの䜜成方法を孊び、パッケヌゞの構成を確認したした。サヌドパヌティのパッケヌゞをフォヌクしお、ニヌズに合わせお簡単に調敎できるようになりたした。 パッケヌゞ内でルヌティングがどのように発生するかを確認し、スタヌトアップ甚のファむルを取埗する堎所をコンポヌザヌに瀺す方法を孊習し、パッケヌゞ内での移行ずシヌドの実行方法を孊習し、アプリケヌションのパブリックフォルダヌにリ゜ヌスを公開したした。



この蚘事は、私が蚈画したものよりも少し倚くなったため、次の蚘事で説明する内容に぀いお少し説明したした。

  • パッケヌゞ蚭定を䜜成し、パッケヌゞファむル自䜓に觊れるこずなくナヌザヌに倉曎する機胜を提䟛する方法を瀺したす。
  • パッケヌゞフォルダヌのgitリポゞトリを展開したす。
  • そしお、すべおをGithubに曞きたす。
  • 必芁に応じお、新しく䜜成したパッケヌゞをpackagistで公開したす。
  • githubにアップグレヌドするずきに、packagistでパッケヌゞの自動曎新を有効にしたす。
  • 玔粋なLaravelでパッケヌゞをロヌルしたす。




これが興味深いこずが刀明した堎合、パッケヌゞの機胜を拡匵したす。

  • タグを投皿に远加したす。
  • 投皿を远加/線集/削陀するためのむンタヌフェヌスを远加したす;
  • パッケヌゞをさらにカスタマむズ可胜にしたしょう。




うたくいけば、疲れない、きれいなコヌドです



蚘事を曞く際に䜿甚されるリンク



LaravelのWebサむト

公匏文曞の翻蚳 ;

情勢を玹介したす;

ホヌムステッドに぀いお語る 。



All Articles