ふたりはララベル (Laravel PHP Framework)

PHPフレームワークのLaravelの体験記を書いていきます。こんなタイトルのブログですが萌え系アニメは一秒たりとも観たことがありません。

storeとupdateで共通で使えるバリデーション

storeとupdateでバリデーションを共通化したいけど、updateの時だけユニークチェックしたい。という時の書き方。あまりキレイじゃないね。。。

public function valid()
{
  $validator = \Validator::make($this->toArray(), [
    'code' => 'required|max:255',
  ]);

  if ($this->id && !$validator->fails()) {
    $validator = \Validator::make($this->toArray(), [
      'code' => 'unique:titles,code,' . $this->id
    ]);
  }

  return $validator;
}

Requestに値を入れてテストする

コントローラーをテストする時にRequestの変数に値を入れる。

$request = new Request;

$request->merge([
'name' => 'testname',
]);

$controller = new \Lb\Http\Controllers\TitleController($request);

$controller->update($request, 100);

$title = Title::find(100);

$this->assertEquals($title->name, 'testname');

長くなったLaravelのModelを分割

長くなったLaravelのModelを分割する方法の一つとして、私は上位モデルを使うときがある。


Titleモデルのうち、Updateに関する機能を独立させるときはこんな感じ。テーブル名を指定するのがポイント。

class TitleUpdate extends Title
{
 protected $table = 'titles';

 public function myvalidator($request)
 {
	return \Validator::make($request->toArray(), [
		'releasedate' => 'date_format:Y/m/d',
	]);
 }
}

PostgreSQLで大文字小文字検索

「iLIKE」を使えば、PostgreSQLで大文字小文字関係なく検索できる。

Mymodel::where('name', 'iLIKE', $name)->first();

Laravel5.3のログインをメールアドレス以外にする

Laravel5.3で、またやり方が変わったみたい。編集対象のファイルは

App\Http\Controllers\Auth\LoginController.php
    public function username()
    {
        return 'username';
    }

XserverではOwncloud9以降がインストールできない

XserverではOwncloud9以降がインストールできなかった。libxml2のバージョンが低いから。これは困った。しょうがいないからOwncloud8を使うしかないんだけど、Owncloud8だとPHP7に対応していない。つまりXserverのPHPが7以上にあげられないのだ。

Laravel5.2からコンテナ登録方法が変わった

古い書き方

$this->app['myapp'] = $this->app->share(function($app)
{
 return new Myapp;
});

新しい書き方

$this->app->singleton('myapp',function($app)
{
 return new Myapp;
});

Laravel5でajax

Laravel5.2系の古いバージョンでajax動かしていたんだけど、5.2系の新しいバージョンだと動かない。よくわからないけどTOKEN入れないとダメらしい。

js側

$.ajaxSetup({
 headers: {
  'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
 }
});

ヘッダ

<meta name="csrf-token" content="{{ csrf_token() }}" />

XserverのPHPでエラー

Laravel5.3をXserverで動かそうとしたらエラーになった。

 [ERROR] Use of undefined constant STDIN - assumed 'STDIN'

bootstrap/autoload.phpの先頭にdefine('STDIN', fopen('php://stdin', 'r'));を置いたら収まった。何だったんだ。

<?php

define('LARAVEL_START', microtime(true));
define('STDIN', fopen('php://stdin', 'r'));

Laravelのmigrate:resetで外部キーエラー

Laravelで

php artisan migrate:reset

したら、以下のエラーが出た。外部キー関連のエラー。

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or upda
te a parent row: a foreign key constraint fails (SQL: drop table if exists
`tags`)

dropする順番間違えていた。先にキーの関連付けテーブル消すべきだった。以下が正しい順番。

public function down()
{
 Schema::dropIfExists('title_tag');
 Schema::dropIfExists('tags');
}

Laravelのログインをメールアドレス以外にする

AuthControllerに「protected $username = 'name';」を足す。

<?php

namespace Song2\Http\Controllers\Auth;

use Song2\User;
use Validator;
use Song2\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Registration & Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users, as well as the
    | authentication of existing users. By default, this controller uses
    | a simple trait to add these behaviors. Why don't you explore it?
    |
    */

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    protected $username = 'name';

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/';

XserverにLaravelを置くときの.htaccess

<IfModule mod_rewrite.c>
    suPHP_ConfigPath /home/MyServerName/MyDomain/xserver_php/
    AddHandler x-httpd-php5.5 .php .phps
    AddHandler fcgid-script .php .phps
    FCGIWrapper "/home/MyServerName/MyDomain/xserver_php/php-cgi -c /home/MyServerName/MyDomain/xserver_php/php.ini" .php
    FCGIWrapper "/home/MyServerName/MyDomain/xserver_php/php-cgi -c /home/MyServerName/MyDomain/xserver_php/php.ini" .phps
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

LaravelのPHPUnitでログインする

LaravelのPHPUnitでログインする。

class AccessTest extends TestCase
{

    public function setUp()
    {
        parent::setUp();

        $user = \App\User::where('name', 'dummy')->first();

        $this->be($user);
    }
    
    public function testBasicExample()
    {
        $this->visit('home');
    }
}

phpdocを準備しないで使う

私はphpDocumentorが好きなんだけど、Windows上だとインストールが大変苦労する。なので「phpDocumentor.phar」から直接実行している。

phpDocumentor.pharをダウロードする

ここにphpDocumentor.pharがあるのでダウンロードする。
github.com

phpDocumentor.pharを実行したいフォルダに置く

私はLaravelのartisanがある場所と同じところに置いている。

実行する

php phpDocumentor.phar -d app/

Laravel5.2のアプリケーション名を変更する

Laravel5.2のマニュアルからアプリ名変更のコマンドが消えていたのでメモ。

$ php artisan app:name Horsefly