p●izaで学んだことの備忘録。インデントとか滅茶苦茶だけど許して
1.laravelの導入
laravel new (プロジェクト名)
5分くらいでできます。
laravelをinstallしましたら、始めに'hello world'と表示させていきましょう。記述させるにはフロントのファイルを弄ればいいですね。
laravelではresouress/views/....にフロントが記述してますのでそこのファイルを弄ればよいです。
さて、laravelはバックエンドで動かす言語です。バックエンドで動かすのなら、SQLに接続できないとだめですね。
そこで.envファイルにある
DB_DATABASE=mybbs
DB_USERNAME=root
以上の2点を変更してください。(環境に応じる)
laravel はMVCモデルと呼ぶ処理を実装しています。流れとして下記の図のように、ユーザーからのリクエストを受け、ルーティングで処理先を決定し、コントローラーで処理、モデルでデータベース操作を行い、ビューで表示する...といった流れです。よくわかりませんね、これからじっくりと説明しますね。
2.モデルの作製
上記で解説したmvc..要するに役割ごとに分かれており、それぞれの役割ごとに記述する場所が異なるってことですね。ならそのたびにファイルを作製するって??(そんな面倒なことはし)ないです。実はコマンド一つでできます。ターミナルで
php artisan make:model Article(モデルの名前) -m -c -r
これがダメなら
php ./artisan make:model Article(モデルの名前) -m -c -r
とします。今回は便宜上モデルの名前を'Article'としておきます。この際、単数形が望ましいです。上手にできたら
model create sculley
と出ます。では確認がてらのぞいてみましょう
bbs/app/model/Articleでは
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
}
bbs/app/Html/Controller/ArticleControllerでは
(略)
更にbbs/database/migrete/以下を覗くと
bbs/database/migrete/xxxxxxxが作製されてます(xxxxxxは日付)
この日付けのやつがデータベースへ反映させるやつです。肝心ですね。
さて、このXXXXのファイルを見てみましょう。関数が沢山ありますね。うちの一つを見ると
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
Schema::create...以下を見ると名前が自動で反映されてます。はぇーーすっごく便利。ではここでカラムを挿入しましょう
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->id('id');
$table->string('content'); ※型に注意。
$table->timestamps();
});
}
はい。書いただけです。これでは反映されません。コマンドを打ちましょう。
php artisan migrate
これをしないと反映されません。
ではcontentカラムを挿入したので、データを入れていきましょう
同じくbbs/database/migrete/xxxxxxx...内にある public function up()関数内で
{
DB::table('articles')->insert([
['content' => 'リンゴ'],
['content' => 'バナナ'],
['content' => 'オレンジ']
]);
と記述しましょう。データが挿入されてるはずです。挿入しましたらデータの更新です。
php artisan migrate
これでよかったですね。
3.ルーティングの作製
先ほどはモデルを作製しました。ですが表を見てください。中心部にあるコントローラーが色々がんばってますね。でもその前にルーティングがいます。
WEBページを思い出してほしいのですが、ページやアドレスごとに処理が異なりますよね?ルーティング君はリクエストを受け取り、その処理を誰に、どこにするのかを司ります。
ではルーティングの設定に参りましょう。
routes/web.phpを確認してください
Route::get('/', function () {
return view('welcome');
});
とあるはずです。
ここのファイルに更に
Route::get('/articles', 'ArticleController@index')->name('article.list');
と記入します。
ここの->name('article.list')..はアプリケーションの中で参照するときの名前です。name()...で名前を付けたのですね。名前を付ける事でページの偏移が楽になります。
phpのformのactrionなんかにこの名前を入力するとそこに飛べます。いいですね
また初期設定として、Laravelのアプリケーション内で全てのURLをHTTPSに強制させたいので
app/Providers/AppServiceProviderのfunction Boot() に
public function boot()
{
URL::forceSchema('https');
}
とします。これで良しです。
ここでundefined type 'URL'. laravel と出るなら
use Illuminate\Support\Facades\URL;
と追加してください。収まります
4.コントローラーとビューの作成
コントローラーはHTTPリクエストを受け取りそのアクションを行います。ページの偏移やデータベース関連などです。大忙しです。
ビューはフロント領域です
では手始めにページの偏移から行きましょう。
app/Http/Controller/ArticleContolloerより
public function index()
{
return view('index');
}
はい。これでviewのindexを返すようになりました。
では//bbs/resources/viewsより、index.blade.php を作製しましょう。index.blade.php..に
<a>hello</a>
と記入して
localhost:XXXX/articles
とすれば'hello'と出ます。ここでなんで'localhost:XXXX/articles' とお思いの方もいますが、routes/web.phpの Route::get('/articles', ...@index.. で制定
してますね。で、/ArticleContolloer...でindexを実行するとview('index');と返すとなってます。ここら辺は実感しにくいですが解るとなるほどーーとなりますので根気よく頑張りましょう。
さて、ページが偏移するだけではつまらないですね。せっかくですから欲しいですよね、データベースのデータ。欲しいですね。引数からのデータ
では手始めに、routes/web.phpに
Route::get('/articles/{id}', 'ArticleController@show')->name('article.show');
と記載しましょう。これでarticles/{id}とする事でIDを受け取れます。
そして、app/Http/Controller/ArticleContolloerに
public function show()
{
$message = 'Welcome to my BBS';
$articles = Article::all();‘<--小 大
return view('index', ['message' => $message, 'articles' => $articles]);
}
と記載し、//bbs/resources/viewsより、
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>paiza bbs</title>
<style>body {padding: 10px;}</style>
</head>
<body>
<h1>paiza bbs</h1>
<p>{{ $message }}</p>
@foreach ($articles as $article)
<p>{{ $article->content }}</p>
@endforeach
</body>
</html>
これでOKです。ではlocalhost:xxxxx:/article/1と。。
Failed to connect server. Error: connect ECONNREFUSED
あれー?おかしいね(秀)?
あっ・・・そっかぁ...起動コマンドを忘れてました
php artisan serve
はい。これで無事にデータが取り出せます
捕捉
route/web.phpに
Route::get('/', function () {
return return('welcome');
});
がありましたね?ここのViewはMVCモデルのviewを返すことになってます。ではviewではなくredirectにするとどうでしょうか?
Route::get('/', function () {
return redirect('welcome');
});
すると/indexに偏移します。直接的で便利ですね。
- ビューを直接返す (view('welcome')) → その場で welcome.blade.php を表示
- リダイレクトする (redirect('welcome')) → /welcome に移動して別ルートとして処理
※laravel 8以降のルーティングの書き方が変わります
Route::get('/articles', 'ArticleController@index')->name('article.list');
が
Route::get('/articles', [ArticleController::class, 'index'])->name('article.list');
