ホーム > 技術系 > Laravel

Laravelのアーカイブ

Laravelのファイル、フォルダのパーミッション設定

Laravelのファイルとフォルダのパーミッション設定についてです。

下記の記事が参考になりました。

Laravelのパーミッションを適切に設定 | Qiita

ディレクトリに対して権限を変更
sudo find laravel-root-directory -type d -exec chmod 750 {} \;

ディレクトリは750なので、所有者は全部可能、グループは読み実行可能、その他はできない設定

ファイルに対して権限を変更
sudo find laravel-root-directory -type f -exec chmod 640 {} \;

ファイルは640なので、所有者は読み、上書き可能、グループは読みのみ可能、その他はできない設定

最後にストレージとキャッシュの権限を変更
sudo chmod -R 770 laravel-root-directory/storage/ laravel-root-directory/bootstrap/cache/

ストレージ、キャッシュフォルダは所有者、グループは全部可能。その他はできない設定。

webサーバーのApacheをインストールすると作成されるwww-dataをグループに追加する
sudo chown -R myusername:www-data laravel-root-directory

これは、上記はwww-dataグループになっていますが、自分の環境(CentOS、nginx)では、httpdのグループがwwwだったので、以下の設定で上手くいきました。

sudo chown -R myusername:www laravel-root-directory

グループ「www」がphpを自分の環境の場合実行しているので、phpファイルは読み出しのみの設定で問題ありませんでした。
phpファイルの実行権限は、所有者、グループとも読みのみで問題ないんですね。
実行権限が必要なのかなとイメージ的には思っていたのですが。

例えばPerlなんかはCGIで755にするのが一般的でしたが、755ってのは所有者は全部できて、グループユーザが読み、実行権限があるということですもんね・・・。

使っているPHPはPHP-fpmなので、モジュール版ではなくてCGI版なのですが、同じCGIでもPerlとPHP-FPMではパーミッションが違うと、これはややこしい話です・・・。

Laravelで、404エラー permission deneidに対処

LaravelをCentOS、nginx環境にインストールしたのですが、初期設定完了後にサイトへアクセスすると、404エラーが発生しました。

エラーログを確認すると

permisson denied

が発生

phpファイルへのアクセスが拒否されているようです。

該当のエラーが起きているファイルやディレクトリを

chmod 777 エラーが起きているファイル

にしています。

結果、そこから先のファイルがさらにエラー

プロジェクトフォルダとファイルを全て777にしたらいけるんでしょうけど、それはそれでセキュリティに不安が残ります。

そもそも、nginx環境のphpのサイトで、プロセスを実行しているユーザってどのユーザなのでしょうか。

ps コマンドでプロセスを監視してみます。

すると

httpd php-fpm

となっていたので、ユーザ「httpd」が実行しているようです。

ユーザ「http」が属しているグループはどこなのでしょうか。

groups httpd

httpd : www

ということで、httpdユーザは、グループ「www」に所属していました。

プロジェクトフォルダのオーナーをwwwに変更してみます。

chown -R ユーザ名:www プロジェクトフォルダ名

これで、該当のフォルダのオーナーのグループが「www」になりました。

これで、サイトにアクセスするとエラーが消えて無事にサイトが表示されました。

Laravel5.7 Homesteadで2つ目のサイトを追加する

Laravel Homesteadで、2つ目のサイトを追加する手順についてです。

Homesteadに2つ目のサイトを追加する手順についてですが、メインマシンのHomesteadディレクトリにある、Homesteadディレクトリにサイト構成を追記します。

Homestead.yml

sites:
– map: homestead.test
to: /home/vagrant/code/project1/Laravel/public

– map: homestead.test2
to: /home/vagrant/code/project2/public

databases:
– homestead

– site2

サイトと、データベースに必要なデータを追加します。

その後、Vagrantを再起動します

vagrant reload –provision

メインマシンのhostsファイルに、2つ目のサイトの設定を追記します。

192.168.10.10 homestead.test2

これで、homestead.site2にアクセスすると、

no input file specified

となります。

2つ目のサイトにLaravelがインストールされていないためです。

メインマシンから

vagrant ssh

で仮想マシンにログインします。

Laravelをプロジェクトフォルダにインストールします。

cd /home/vagrant/code/
composer create-project –prefer-dist laravel/laravel project2

この後、

homestead.site2

にアクセスして、Laravelの初期サイトが表示されたら初期設定完了となります。

Laravel5.7で認証機能を使う

Laravelで認証機能を使う方法についての解説です。

Laravelには認証に必要な機能が最初から準備されているので、必要であれば使用することができます。

ちなみに、普通にベーシック認証を行うのであれば、.htaccessを使えばいいのですが、ここで言っている認証とは、ユーザIDとPWを入力してログインし、ログインしていなければログインページに飛ばされるというやつです。

あまりカスタマイズしないのであれば簡単に実装できます。

artisanでauth機能を準備する

コマンドラインで、Laravelのプロジェクトフォルダに移動し、

php artisan make:auth

このコマンドを実行します。

これを準備することで、必要なファイルがLaravelディレクトリに生成されます。

rouesファイルに追記されている

routesのweb.phpに、さきほどのコマンドを実行することで、下の2行の記述が追加されています。

Auth::routes();

Route::get(‘/home’, ‘[email protected]’)->name(‘home’);

上記は、homeディレクトリにアクセスしたときに、ログイン画面が表示される記述です。

あとは、ルートファイルの認証をかけたいページに、以下の記述を追加することで、該当するページに認証がかかります。

Route::get(‘/admin’, ‘[email protected]’)->middleware(‘auth’);

基本認証

ログイン画面を通した認証でなく、基本認証をしたい場合も簡単に実装できます。

auth.basicミドルウェアを使用します。

Route::get(‘/admin’, ‘[email protected]’)->middleware(‘auth.basic’);

基本認証を使用した場合に求められるID/PWは、laravelでプロジェクトを作成後にmigrateで作成される、userテーブルに登録されているユーザemailとパスワードと同じになります。

Laravelの初期設定

Laravelをインストール後に、初期設定で変えておく場所についてのメモ書きです。

.envファイル

.envファイルは、Laravelをインストールにしたフォルダにあります。

ここに、プロジェクトが接続するデータベースに関する設定などの情報が保存してあるので、必要に応じて変更する必要があります。

.envファイルを変更した後に反映させるには、

php artisan config:clear

を実行する必要があります。

app.php

/config/ディレクトリにある「app.php」ファイルに、いくつか設定に関する項目があります。

timezoneの設定です。日本のサイトの場合は、Asia/Tokyoにしておくとよいでしょう。

‘timezone’ => ‘Asia/Tokyo’,

デフォルトでは、en になっていますが、これは英語ということなので、日本語に設定します。

‘locale’ => ‘ja’,

ただし、これだけでは英語のままでに保護になりません。

/resources/lang/en

このフォルダとその中のファイル群を

/resources/kang/en

にまるっとコピーします。

あとは、それ以下にエラーメッセージの文章が全部英語で書いてあるので、それを
地道に日本語に変更します。

全部変更すると大変なので、使っているぶんだけ変更することでも問題ないと思います。

以下に翻訳版が上がっていました。
5.1のだそうですが・・・。

Laravel 5.1 日本語バリデーションメッセージファイル

また、これだけでは attributeが英語で出力されるので

さきほどの validation.phpの

‘attributes’ => [],

このようにすることで、対応するattributeが日本語で出力されます。

‘attributes’ => [
‘title’ => ‘タイトル’,
‘body’ => ‘本文’,
]

フォームでエラー時に入力値を保持する方法(Laravel5.7)

Laravel5.7で、フォームを作っていてエラー発生時に入力のフォームの値を保持する方法についてです。

結論からいうと、bladeテンプレートに {{ old(‘項目名’) }} の値をもたせることで入力前の値を保持できます。

こんなかんじです。

 <table class="table table-striped">

            <tr>
                <td>タイトル</td>
                <td><input type="text" name="title" value="{{ old('title') }}" placeholder="タイトルが入ります" /></td>
            </tr>

            <tr>
                <td>本文</td>
                <td><textarea name="body">{{ old('body') }}</textarea></td>
            </tr>

これは、入力値のフォームなので、はじめは空欄なので、入力前の値だけ保持できていればいいですが、これが編集する場合だと

初期) 編集前の値を持っている
エラー時) 入力エラーの値を持っている

の2つの状態を持っている必要があります。

これは以下のように記述することで解決できます。

<table class="table table-striped">

            <tr>
                <td>タイトル</td>
                <td><input type="text" name="title" value="{{ old('title' , $post->title) }}" /></td>
            </tr>

            <tr>
                <td>本文</td>
                <td><textarea name="body">{{ old('body', $post->body) }}</textarea></td>
            </tr>

oldの2つ目にデフォルト値を持たせることができます。

Larabel(5.7)でフォームを作成する手順

Laravelで簡単なフォームを作るのは基礎中の基礎ですが、慣れないうちは何箇所かつまづいたので記録に残しておきます。

フォームの仕様

記事を投稿してデータベースに保存する

件名(タイトル)と本文を入力し、データベースへ保存する。

サイトへアクセスすることで保存された記事一覧と、

ただこれだけのシンプルな仕様。

まずは環境構築

環境構築にはhomesteadを利用しました。

手順はこちらの記事に書いているので割愛します。

Laravel Homestead導入時の悪戦苦闘メモ

最初にやったのは古いバージョン(Laravel4系)だったので、再度やりなおしてLaravel5系でやってみました。

Laravel HomesteadをPHP7で動作させる

環境構築に手間取りましたが、ようやく動作したのでフォームの制作

1.マイグレーションでデータベースを作成

まずは、Homesteadの環境にログイン後、Artisanコマンドでテーブルを作成します
今回は、記事を投稿するので、postsというテーブルを作成

php artisan make:migration create_posts_table –create=posts

public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->boolean('delete_flg')->default(0);
            $table->timestamps();
        });
    }

ファイルを作成した後、

php artisan migrate

でテーブルを作成します。

モデル作成

テーブルを作成後、テーブルに対応したモデルを作成します。

php artisan make:model Post

これで、

/App/Post.php

が作成されました。
これで、テーブルに対応したオブジェクトを呼び出すことができるようになります。

このモデルはあとで使います。

管理画面を作る

まずは、記事を投稿する管理画面を作ります。

まずは管理画面の処理に対応するコントローラーを作成します。

php artisan make:controller AdminEntryController

これで、/Http/Controllers/AdminEntryController.phpが作成されました。

このファイルには管理画面の処理に対応する記述を追加していきます。

この時点では雛形が作られただけで処理は何も入っていません。

ルーティングを記述する

/admin/entry にアクセスしたとき、管理画面の投稿画面を表示するようにします。

ルーティングを記述ファイルは、/routes/web.phpにあります。

これに以下を追記します。

Route::get(‘/admin/entry’, ‘[email protected]’);

これでは、url「/admin」にアクセスしたときに、コントローラAdminEntryControllerの「top」メソッドにアクセスするということです。

最初は、とりあえずテンプレートを単純に表示するだけにしてみます。

public function top()
    {
        return view('admin.entry');
    }

これは、このメソッドが実行されたときに

/resources/views/admin/index.blade.phpを表示するという処理です。

まだテンプレートを作成してないので、URLにアクセスしてもエラーになります。

テンプレートを作成します。

bladeテンプレートの作成

bladeテンプレートは、laravelで使われているテンプレートで固有の記法があります。

CMSやフレームワークを使ったことがある人であればテンプレートという説明を聞くと大体イメージがつかめると思いますが、基本的には同じです。

ただ、bladeテンプレートの特徴としては、親と子の継承というものが特徴です。

大体のサイトは、基本となる共通部分があって、後はコンテンツ部分やタイトルなど、一部異なる部分があります。

Laravelのbladeテンプレートでは、共通している部分をまず、親のテンプレートとして作成します。

あとは、それぞれのページは、親のテンプレートを継承することで、異なる部分だけ作成するというようなイメージです。

この特徴により、子のテンプレートは最小限の記述で、また必要なテンプレートも最小限ですみます。

これで、bladeテンプレートの作成が完了したら、/admin/へアクセスすると、エラーがなければサイトが表示されます。

フォームを作成する

とりあえず、作成したフォームの雛形のテンプレートは以下の通りです。

注意が必要な点としては、フォームは、デフォルトの設定では、クロスサイトリクエストフォージェリ対策に、@csrfをテンプレートに埋め込んで置く必要があります。
これを書いていないと投稿時にエラーになります。

@extends('admin.parent')

@section('title', '投稿管理(入力画面)')

@section('content')
    <form action="/admin/entry/" method="post" id="formid" enctype="multipart/form-data">

        @csrf

        <table class="table table-striped">

            <tr>
                <td>タイトル</td>
                <td><input type="text" name="title" value="" placeholder="タイトルが入ります" /></td>
            </tr>

            <tr>
                <td>本文</td>
                <td><textarea name="body"></textarea></td>
            </tr>

            <tr>
                <td colspan="2" class="text-center">
                    <input type="submit" name="submit22" value="登録" class="btn btn-primary">
                     <input type="hidden" name="action" value="ok">
                </td>

            </tr>

        </table>

    </form>
@endsection

これを、実行したときに登録する処理を追加する必要があります。

まずは、ルーティングに以下を追加します。

Route::post(‘/admin/entry’, ‘[email protected]’);

最初のルーティングは、getで書いてましたが、投稿の処理はpostで渡すことで処理を分岐できます。

postでURLにアクセスしたときには、同じコントローラーでも異なるメソッドを実行するようにしています。

上記の処理ではcompleteメソッドを実行します。

completeメソッドの定義

completeメソッドを以下のように定義しました。

    public function complete(Request $request)
    {
        $post = new Post();

        $post->title = $request->input('title');
        $post->body = $request->input('body');

        //セーブメソッドは、継承している親クラスのモデルオブジェクトに定義されている
        $post->save();

        return view('admin.complete');
    }

$post = new Post();

で、最初に作成したPostモデルのオブジェクトを呼び出しています。

この記述で行うには、ファイルの先頭に

use App\Post;

を追記しておく必要があります。

この追記がない場合

$post = new App\Post();

になります。

その変数にポストで投げられた値をリクエストから取得して、saveメソッドでデータベースへ保存します。

その後は、完了画面のテンプレートを表示します。

この処理はかなりシンプルですが、Laravel独特の記法なので、覚えておく必要があります。

エラーがなければ、これでフォームの保存が実行できます。

投稿のサイトへの表示

今度はサイトに表示する処理を書いてみます。

一覧画面と詳細画面に分けて作成します。

まずはルーティングに必要な処理を追加します。

//トップページで一覧表示
Route::get(‘/’, ‘[email protected]’);

//詳細ページの表示
Route::get(‘/post/{id}’, ‘[email protected]’);

この例では、ページの表示処理を、PostsControllerというクラスを作成して行います。

トップページに一覧を表示する(indexメソッドの実行)処理、詳細ページを表示する処理(detailメソッドの実行)に分けています。

PostControllerは、最初と同じく

php artisan make:controller PostController

で作成しておきます。

以下が、PostsControllerクラスに定義した、トップページと詳細ページの表示のメソッドです。

use App\Post;

class PostsController extends Controller
{
    //トップページを表示する
    public function index(Request $request) {

        $posts = Post::where('delete_flg' , '<>', '1')
            ->get();

        return view('index', compact('posts'));

    }


    //ブログ詳細記事を表示する
    public function detail(Request $request, $id) {

        $post = Post::find($id);

        return view('post', compact('post'));

    }
}

indexメソッドでは、削除フラグが1でなく記事を取得するような処理を行っています。

detailメソッドでは、URLから取得したユーザIDに該当する記事を取得して、テンプレートに表示しています。

bladeテンプレートはそれぞれ以下のように定義しています。

@extends('layout')

@section('title', "新着記事")

@section('content')

    <ul>

    @foreach ($posts as $post)
        <li><a href="/post/{{ $post->id }}">{{ $post->title }}({{ $post->created_at->format('Y年m月d日') }})</a></li>
    @endforeach

    </ul>

@endsection
@extends('layout')

@section('title', $post->title)

@section('content')

    <p class="text-right">{{ $post->created_at->format('Y年m月d日') }}</p>

    <div class="contents">
    {!! nl2br(e($post->body)) !!}
    </div>

@endsection

記事の編集、削除

最後に、管理画面から記事の編集と削除を行えるような処理を追加します。

今回のケースでは、ルートファイルにまず以下のような処理を追記しました。

Route::get('/admin/edit/{id}', '[email protected]');

Route::post('/admin/edit/{id}', '[email protected]');

Route::get('/admin/delete/{id}', '[email protected]');

編集画面は、同じURLでアクセスしますが、最初はgetでアクセスし、編集完了処理はpostでアクセスすることで実行するメソッドを分けています。

//記事を編集する
    public function edit(Request $request, $id) {

        $post = Post::find($id);

        return view('admin.edit', compact('post'));

    }

    //記事の修正を完了する
    public function store(Request $request , $id)
    {
        $post = Post::find($id);

        $post->title = $request->input('title');
        $post->body = $request->input('body');

        //セーブメソッドは、継承している親クラスのモデルオブジェクトに定義されている
        $post->save();

        return view('admin.complete');
    }

    //記事の削除を完了する
    public function delete(Request $request , $id)
    {
        $post = Post::find($id);

        $post->delete_flg = 1;

        //セーブメソッドは、継承している親クラスのモデルオブジェクトに定義されている
        $post->save();

        return view('admin.delete');
    }

削除処理は、delete処理を使うのではなく、一応データベースには残しておきたいので、delete_flgを1にするアップデート処理にしています。

管理画面のトップページのbledeテンプレートも、記事一覧を表示するように変更しておきました。

@extends('admin.parent')

@section('title', '投稿管理')

@section('content')
<div class="text-right">
    <input type="submit" name="submit" value="新規登録" class="btn btn-primary" onclick="location.href='/admin/entry/'" />
</div>

    <div class="content">

        <table>
            @foreach ($posts as $post)
                <tr><td><a href="/post/{{ $post->id }}">{{ $post->title }}</a></td><td><input type="submit" value="編集" onclick="location.href='/admin/edit/{{ $post->id }}'" ></td><td><input type="submit" value="削除" onclick="location.href='/admin/delete/{{ $post->id }}'" ></td></tr>
            @endforeach
        </table>

    </div>

@endsection

homesteadの502 Bad Gatewayエラーに対処

Laravelでサイトを構築するのに、仮想環境でHomesteadを利用していたのですが、サイトへアクセスすると、最初だけ「502 Bad Gateway」というエラーが表示される状況に遭遇しました。

しかも、ずっと表示されるわけでなく、何回か再読込をすると解消するという謎の状況。

とりあえず、nginxのエラーログを見てみると、以下のエラーが。

[error] 2276#2276: *472 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.10.1, server: homestead.test, request: “GET / HTTP/1.1”, upstream: “fastcgi://unix:/var/run/php/php7.3-fpm.sock:”, host: “homestead.test”

このエラーで対処法をググっていろいろ調べていたところ、対処法が見つかりました

New Laravel (Homestead) installation: 502 Bad Gateway – *Refresh* – the website is displayed correctly | stackoverflow

以下の通りにすることで治りました。

まずは、/etc/php/7.3/mods-available/xdebug.iniを編集します

sudo vim /etc/php/7.3/mods-available/xdebug.ini

上記ファイルの行の頭に「;」を全てつけてコメントアウトします。

nginxと、php7.3-fpmを再起動します

sudo service nginx restart
sudo service php7.3-fpm restart

これで、502 bad gatewayのエラーは出なくなりました。

xdebugというのが、phpのエラーを詳細に追いかけるツールだそうで、それが有効になっていることの副作用的なかんじでしょうか?

何にせよ上記を無効にすることで治りました。

php artisan migrateでAccess denied for user ‘homestead’@’localhost’に対処

Homesteadのlaravelで、artisan migrateでデータベースを作成しようとしたところ、エラーが起きました。

実行したコマンド
php artisan migrate

エラーの内容
SQLSTATE[HY000] [1045] Access denied for user ‘homestead’@’localhost’ (usin
g password: YES) (SQL: select * from information_schema.tables where table_
schema = homestead and table_name = migrations)

原因についてですが、laravelの実行ディレクトリで、「.env」ファイルを編集する必要があるということなので、編集してみましたが、結局同じエラーが出て接続できません。

さらに原因を調べてみたのですが、「.env」ファイルを変更してもそれを反映させるためにコマンドを実行する必要がありました。

laravelの実行ディレクトリで、以下のコマンドを実行します。

php artisan config:clear

これで、再度マイグレーションを実行したところ、問題なく実行され、データベースにも反映されました。

Laravel HomesteadをPHP7で動作させる

Laravel HomesteadをPHP7で動作させる方法についてです。

Laravelの仮想環境のLaravel Homesteadについて検証していたのですが、公式サイトのチュートリアルに沿って導入していると、何故かLaravelと、対応するPHPが5系でした。

最新のPHP7に対応させるための方法を探していたのですが、調べると何のことはなく、公式サイトのHomesteadのチュートリアルにはPHP5系に対応する記事と、PHP7に対応する記事でそれぞれチュートリアルがあるだけでした。

前の記事で紹介していたのは、4.2なのでphp5系に対応してました

Laravel 4.2 Homestead (PHP5対応)

Laravel 5.7 Homestead (PHP7系対応)

後者のチュートリアルに従ってやっていれば問題なくPHP7系のHomestead環境が整いました。

前者はHomesteadコマンドベースになっていて、後者はVagrantコマンドがベースになっているので、やり方の違いに若干戸惑いましたが・・・。

Laravel Homestead導入時の悪戦苦闘メモ

laravelの勉強をしていて、環境構築用にlaravel homesteadを導入してみたのですが、かなり苦戦したのでメモを残しておきます。

laravel homesteadとは

laravelをローカル環境に導入するときに、環境構築の手間を省くために公式に準備された仮想環境構築ツールです。

laravel homesteadの仮想環境の構築には、Virtual Box+Vagrantを利用するのですが、Vagrantの設定をlaravelの仮想環境に特化するように準備してくれるツールです。

公式サイトには、laravel homesteadを使うことでローカルへの環境構築が楽ちんになると書いてあったのですが、思わずはまってしまったのでメモとして残しておきます。

導入の手順

1・Virtual BoxとVagrantをダウンロードします。

homesteadは基本Virtual BoxとVagrantを使うだけなので、何はともあれこの2つをインストールします。

2・Composerが導入されていない場合はComposerを導入します

Composerは、phpのパッケージ管理ツールです。
Composerは、Laravelを導入するのにあたってほぼ必須となるツールです。
入ってない場合は入れておきます。

3・Homsteadの設定を行います

公式サイトの手順に従います

HomesteadのCLIツールのインストール

composer global require “laravel/homestead=~2.0”

bashプロファイル ~/.bash_profileを編集してコマンド実行パスを追加

export PATH=$PATH:~/.composer/vendor/bin

ymlファイル(Vagrant用の設定ファイル)の初期化

homestead init

SSHキーの設定

ssh-keygen -t rsa -C “[email protected]

homesteadの仮想環境生成

homestead up

それで、以下のエラーが出ました。

Bringing machine ‘default’ up with ‘virtualbox’ provider…
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vm:
* The host path of the shared folder is missing: ~/Code

これは、要するに、ホームディレクトリに Codeというフォルダがないということです。

cd ~
mkdir ./Code

これで再度

homestead up

これでエラーが解消され、問題が解決しました

これで、仮想環境が作成されたのでSSHでアクセスしてみます

homestead ssh

無事仮想環境にログインできました。

メインマシンのhostsファイルに、以下を追加します。

192.168.10.10 homestead.app

公式サイトによると、この時点でサイト(homestead.app)へアクセスできるはずなのですが

http://homestead.app

上記URLへアクセスすると、エラー。

No input file specified

これは、ファイルが存在していないということらしい。

調べて見ると、 ymlファイルに設定されているのが以下の通りなのですが

sites:
– map: homestead.app
to: /home/vagrant/Code/Laravel/public

これは、上記のドメインが、/home/vagrant/Code/Laravel/publicに紐付けられているということなのですが、仮想マシンにログインして確認したところ、「/home/vagrant/Code/」以下に、Laravelのディレクトリが存在していない。

これには相当ハマってしまい、調べても原因がよく分かりませんでした。

とりあえず、メインマシンのcomposerのバージョンが少し古かったみたいなので、メインマシンのcomposerのバージョンを最新に更新。

homestead destroy

これで一旦仮想環境を削除して

homestead provision

これで再度作り直してみます。

これで再度サイトへアクセスすると、表示されました。

しかし、今度は別のエラーが・・・

autoload.phpがないとかそういうことらしく、調べれてみると、必要なファイルが存在してないのがあるようなので、これはComposerをアップデートしたらいいということなので、アップデートしてみます。

composer update

すると、途中でエラー。

proc_open(): fork failed – Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php

メモリが足りていないというエラーです。

php.iniを編集して、memory_limitを編集してみるも、駄目。
調べると、swap メモリの設定を追加したらいけるということ。

仮想マシン内で、以下のコマンドをスーパーユーザ権限で実行

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo /sbin/swapon /var/swap.1

これで再度Composerをアップデートしたところ、通りました・・・!

Laravelの初期画面。ついに起動!ここまで長かった・・・
Laravelの初期画面。ついに起動!ここまで長かった・・・

雑感

簡単に仮想環境が構築できるといいつつ、やってみると何箇所かはまるポイントがあって大変でした。

ぶっちゃけ、ローカルの仮想環境って、homesteadなんか使わなくてもMAMPやXAMPで十分じゃね・・・という気もしますが、何故Vagrant+Virtual Boxを使うのが良いのかよくわかりません。

また、仮想環境にデフォルトの設定で2GBのメモリが割り当てられるようなので、仮想環境にメインマシンのメモリも圧迫されます。

とりあえず、こういうものもあるということで、引き続き色々使って試してみようとは思います。

その後

Homestead環境のセットアップが終わってからですが、まずは、Laravelのデフォルトのサイトが表示されています。

その後どうやってサイトを作り込んでいくかですが、メインマシンの

~/Code

フォルダが仮想マシンのエイリアスになっているようなので、そこを作業フォルダにしていけばその後の仮想環境の作業をメインマシンで進めていけます。

作ったサイトはhostsファイルにドメインと仮想マシンのIPアドレスを紐付けることで、仮想マシンでの表示が確認できます。

Homesteadの仮想環境はメモリを圧迫するので、使い終わったら、コマンドラインで

homestead halt

で停止することができ

homestead up

で再度起動できます。

homestead環境の削除

vagrant box remove laravel/homestead –all

ymlファイルの更新後の仮想環境への反映

vagrant reload –provision

Laravelのバージョンアップ

公式のLaravel5.7のHomestead導入ガイドに従ってHomestead環境をセットアップしたのに、デフォルトのLaravelのバージョンが5.4で最新の5.7ではなかった。

5.4から5.7へのバージョンアップは、仮想環境のLaravelフォルダまで移動して、個別に行った。

手順としては、Laravelフォルダにある composer.jsonファイルを編集して、設定内容の変更を行った後に、

composer update

で適用される。
(このあたりはググったら色々でてくるので詳細は割愛)

エラーThe host path of the shared folder is missing: ~/Codeの対処

laravelで、homesteadを導入時に、以下のエラーに遭遇しました

コマンド

homestead up

を実行

それで、以下のエラーが出ました。

Bringing machine ‘default’ up with ‘virtualbox’ provider…
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vm:
* The host path of the shared folder is missing: ~/Code

これは、要するに、ホームディレクトリに Codeというフォルダがないということです。

cd ~
mkdir ./Code

これで再度

homestead up

これでエラーが解消され、問題が解決しました

Laravel勉強メモ

PHPのフレームワークの「Laravel」の勉強メモです。

Laravelとは

PHPのフレームワーク。
日本でも人気が上がってきているが、海外で特に人気がある。
モダンな要素が取り入れられている?

フレームワークを勉強するに渡って有名な「Cake PHP」も良いと思ったのですが、最近人気があるというLaravelについて学習してみることにしました。

Laravelを使用するにあたって

PHPの5.4以上が必要で、「mcrypt」のライブラリをインストール必要がある。

インストールするために「Composer」が必要になる。
ComposerとはPHPのライブラリの依存関係を管理するためのもの。
通常はライブラリはPHP全体に影響するため依存関係の管理が大変だが、コンポーザーの場合プロジェクトごとにライブラリを管理するため依存関係について対処しやすい。

Laravelのインストールと初期設定

インストール時してプロジェクトを作成する。
プロジェクト名のフォルダができ、その中にLaravelの必要なファイル一式がダウンロードされる。

ちなみに、ローカル環境に作成してもいいが、仮想環境を作成する場合は、Larravelには専用の仮想環境を構築するツールの「Laravel Homestead」があるので使うと便利。
Homesteadは、Vagrant + Virtual Boxと同じといえば同じなのだが、Laravelが導入しやすいように最適な環境を構築しやすい。(あると便利なものが一式最初から準備されている)

最初にやること

プロジェクトで必要となるデータベースとデータベースユーザを作成する。
データベースが必要ない場合は必要なし。

データベースを作った場合はプロジェクト内のコンフィグファイル内にデータベースへの接続情報を追記する。

「.env 」が環境ファイルなので開いてデータベース情報を追記する。

artisan(アルチザン)のマイグレーションコマンドを使って、テーブルを作成する。
アルチザンというのは、Laravelに予め準備されたシェルスクリプトのようなもので、コマンドラインで様々な処理を実行することができる。

php artisan make:migration マイグレーション名 –create=テーブル名

上記のコマンドを実行することで、/database/migrations/ 内にマイグレーション用のPHPファイルが作成される。

作成されたマイグレーションファイルを開いて、テーブルのカラム名などを追記する。
デフォルトでは主キーと、タイムスタンプのカラムが設定されている。

php artisan migrate

コマンドで、マイグレーションが実行され、上記マイグレーションフォルダ内に入ったマイグレーションPHPファイルが実行される。

一般的な方法であれば、phpmyadminからテーブルを作成したり管理するが、Laravelではマイグレーションコマンドと設定ファイルでテーブル構造を管理できるかんじといったところ。

しかし、見た感じややこしい。
こんなマイグレーションを使ってコマンドラインでどうこうするより、phpmyadminを使って管理するほうが簡単な気がしてならない。
このあたりはLaravel使う恩恵は微妙といったところかな…。
いろいろやってると「php artisan migrate」実行時によく分からないエラーが

Base table or view not found:

なんだこれ

php artisan migrate:refresh

これで全部解決しました。すべてのマイグレーションを再実行するかんじかな。

php artisan migrate:rollback

上記はロールバック用のコマンドで、最後に行ったマイグレーションをロールバックする

php artisan migrate:reset

すべてのマイグレーションをロールバックする
まあいずれにしてもややこしい。phpmyadminがシンプルでいいです・・・。

モデルの作成

php artisan make:model モデル名
これでモデルを作成

これで app ディレクトリ以下に、作成したモデル名のPHPファイルができている。

モデルは基本的にはデータベースのテーブルと対応した名前をつける。

例えば「users」テーブルの場合、モデルは「User」とすることで、自動的にテーブルとモデルが関連付けされる。

モデルオブジェクトとコントローラで呼び出すことで、テーブルから値を取り出したり保存したりする処理がしやすくなる。

対応するモデルをオブジェクトを呼び出すと、テーブルの項目名の変数を持つので、そこからデータベースに保存するといった処理がシンプルになる。

tinkerコマンド

Tinkerは、コマンドラインで操作できるようになるコマンド。

tinkerコマンドでモデルのオブジェクトを作成して、コマンド形式を使ってテーブルに値を挿入したりすることもできる。
プログラムを書く前に処理を試すことができる他、コマンドラインで直接データベースに値を保存したりすることもできる。

php artisan tinker

ルーティング

ルーティングとは、指定したURLに対してどういった動作をするかをphpファイルの中に書き込んでいくこと。

設定方法はLaravelのバージョンによって異なってくる。
自分の環境はlaravelのバージョンが5.3系なので、サイトのルーティングは

/routes/web.php

に行う。
ここに指定したURLに対しての処理を書き込んでいくと、URLにアクセスしたときに指定した処理を行う。
テンプレートを読み込ます場合は、viewファイルを読み込む。

ここで、URLにIDなどの動的なパラメータ(変数)を渡すこともできるのだが、テスト環境(Mac、Appache)では動作しなかった。
確認してみると、 /private/etc/apache2/httpd.conf の AllowOverride All にすべて変更すると
動作するようになった。(.htaccessはLaraberl上にあるので、サーバの設定が許可する設定になっていないといけない)

view

viewというのは要はテンプレートファイルのこと。

/resources/views/

以下に追加していく。

このテンプレートファイルにhtmlやphpのロジック部分を基本は記述していき、ルーティングファイルやコントローラから読み込むという流れ。

Larabelではbladeテンプレートというテンプレートの形式を利用する。

共通部分のviewファイルは別に作成しておき、個別ページごとのテンプレートファイルから読み込んで変数や動的な部分を埋め込んでいくイメージにしていくと効率が良い。

コントローラー

コントローラーは、サイトの処理を担当する部分。
viewでHTMLのテンプレートを担当し、コントローラーでは処理を担当する。

基本的には route で url と コントローラを指定

コントローラでモデルやリクエストを読み込んで処理を行い、テンプレートを呼び出すという流れ

artisan make:controller コントローラー名

でコントローラーを作成することで、 app/Http/Controllers

以下にファイルが生成されるので、編集することで処理を追加できる。

laravel5.3系の場合、web.phpで、ルーティングでURLで指定した処理で呼び出すコントローラを指定する。

viewとコントローラーを切り分けることで、デザイン(デザイナ担当)の部分と処理の部分(プログラマ担当)を切り分けることができる。

Laravelに関する考察

Artisanコマンドは便利なのか?

Laravelを学ぶ上で、Artisanコマンドは出てくるが、要するに覚えるとシェルのようなかんじで特定の処理を簡単に実行することができる。

しかし、例えば

php artisan make:controller controller名

これは、結局Controllerフォルダにあるファイル名のひな形を作っているだけなので、

もともとある既存のコントローラーファイルをコピーペーストするのと同じである。

そのため、コピペするのと、artisanコマンドで作成するのとどちらが早いかというと、ぶっちぇけコピペするほうが早いとも言える。

そのため、必ずしもテンプレ通りにartisanコマンドを実行しないといけないかというと、使わずにやったほうが早い場合もあるといえる。

ホーム > 技術系 > Laravel

フィード

ページの上部に戻る