Laravel 5 BindingResolutionException in Container.php line 827

Error:

laravel-ioc-binding-exception
laravel-ioc-binding-exception

Context that caused this eror

test controller
test controller
foo service with php primitive type
foo service with php primitive type

When working with laravel 5, have you ever ask yourself that how Laravel IOC work, how Laravel IOC can handle concrete class binding instead of defining in somewhere (for laravel in Service providers).

Basically, if you inject a concrete class to another class, it will automatically bind to that class by laravel Container

Overview of Laravel Container (make, build, getDependencies, resolveClass (or nonClass))

Screenshot from 2016-03-14 09:38:57

 

 

 

 

 

laravel 5 container class:
make function
build function
getDependencies function

By default, If you inject a concrete class to another class, its will automatically bind and resolve by Laravel container.

Service Container Laravel The PHP Framework For Web Artisans
Service Container Laravel The PHP Framework For Web Artisans
laravel ioc build class based on concrete class name
laravel ioc build class based on concrete class name

but, in case in the constructor of some class you inject to a string or non-class parameter, how laravel 5 handle this  https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L793

laravle-container-getDependencies
laravle-container-getDependencies

Its not acceptable that throw an error if a non-class cannot resolveable, but its not make sense to make a function name resolveNonClass just only throw an error (imo, should handle this 😉

There is many ways to deal with this is that writing an service provider to inject a string to another class like this (basically, a service provider abstract class contains $app instance, just bind a dependency manually into it). This is one way

then register above service provider to config/app.php
 

its works!!!, other way to bypass this, is use Str provider class instead of built in string primitive php type.

foo service with Str class
foo service with Str class

By the way, need to update Laravel Container class to deal with primitive type ??? in this function resolveNonClass https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L823

laravel fw container resolveNonClass
laravel fw container resolveNonClass

Reference:
https://laravel.com/docs/5.1/container
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php
http://culttt.com/2014/03/24/exploring-laravels-ioc-container/
http://php.net/manual/en/class.reflectionclass.php

 

A note about solid Principles (Demo in Symfony2)

  1. Single responsibility ( a class have only one reason to change, do not mix up (mess up) everything in a class)
  2. Open for extend, close for modification( move common behavior to interface, flip injection – Uncle Bob)
  3. Liskov Substitution Principle, eg: same output format (array , json, specify type of Type- signature must match, preconditions cannot be greater, post conditional at least equal to, exception type must match). All of the derived class (sub class) could be substitutable (interchangeable)
  4. A client should not be forced to implement an Interface that it does not use (return null in a override function ) – split fat interface to smaller interface.
  5. The higher level of inheritance should not depend on the low level of code, it should depend on the abstract class (Inversion of control, Dependency inversion not Dependency injection, not opposite, but complementary) – decoupling code

note:
class extends 1 class, implements multiple interfaces (like java)
interface extends interface
class implement an interface must override all methods

Demo link:
https://github.com/nguyentienlong/solid-principles-demo

Reference:
https://laracasts.com/collections/solid-principles

TODO: translate to Vietnamese, add more code and explanation

symfony2 cant access app_dev.php from distant host – cấu hình nginx (php fpm) trên centos để chạy symfony2

Sau khi tải symfony2 về từ http://symfony.com/, hoặc dùng composer để cài đặt như hướng dẫn trên trang của symfony2, về cơ bản các bạn đã có thể bắt tay vào “đép” ngay.

Một số bạn dùng nginx, php-fpm trên centos thì cấu hình có thể hơi khác hơn như sau

server {

server_name symfony2.local;

root /usr/share/nginx/html; # cái này tùy thuộc vào nơi bạn để sourcecode

index app_dev.php; #development thì nên để app_dev.php, production thì chỉnh lại app.php

try_files $uri $uri/ /app_dev.php?$query_string;

location ~ ^/(app_dev|app_test.php|app)\.php(/|$) {

include /etc/nginx/fastcgi_params;

fastcgi_pass 127.0.0.1:9000;

fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;

}

}

Các bạn lưu nội dung trên vào file /etc/nginx/conf.d/symfony.conf, sau đó restart lại nginx

Các bạn truy cập theo địa chỉ symfony2.local/http://localhost/symfony/web/app_dev.php –> TADA nếu suốn sẻ nó sẽ hiển thị ra hình thế này

symfony2-welcome

Trong trường hợp bị lỗi Cant access app_dev.php from distant host khi bạn môi trường dev của bạn đặt ở máy ảo, bạn access từ máy host thì nó sẽ bị lỗi trên. Để fix lỗi này chỉ cần vào chỉnh file app_dev.php comment dòng sau

//if (isset($_SERVER[‘HTTP_CLIENT_IP’])

// || isset($_SERVER[‘HTTP_X_FORWARDED_FOR’])

// || !in_array(@$_SERVER[‘REMOTE_ADDR’], array(‘127.0.0.1’, ‘fe80::1’, ‘::1’))

//) {

// header(‘HTTP/1.0 403 Forbidden’);

// exit(‘You are not allowed to access this file. Check ‘.basename(__FILE__).’ for more information.’);

//}

Xong, rựa là bạn có thể bắt tay dzo đép rồi đó ;))

Refs:

1. http://ihaveabackup.net/2012/11/17/nginx-configuration-for-symfony2/

2. http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html

3. http://forum.symfony-project.org/viewtopic.php?f=23&t=41866

 

So sánh 2 phương thức Post, Get

Notice: Bài viết này được tôi viết từ thời còn sinh viên, lúc còn non trẻ – thời mà restful cũng chưa ra những standard như hiện nay (2015). Các bạn đọc và so sánh với những kiến thức hiện tại nhé. Tôi sẽ cố gắng cập nhật nội dung bài viết này sớm  😀

Trong lập trình web. Để xử lý việc nhận gửi thông tin từ  1 form của người dùng nhập vào là rất thường xuyên. Chúng ta thường sử  dụng 2 phương thức POST và GET (ngoài các phương thức sẽ được sử dụng khi làm việc với RESTFUL webservice như PUT, DELETE sẽ được trình bày ở các bài sau liên quan đến RESTFUL webservice) . Tuy nhiên lúc nào sử  dụng POST, lúc nào sử  dụng GET ? Câu hỏi đó ko dễ trả lời vì có những cái chúng ta thường xuyên dùng 1 cách thói quen, chỉ biết dùng sao cũng chạy cả nên rất ít người hiểu rõ và trả lời được câu hỏi này.
Sau đây là sự  giống nhau và khác biệt giữa chúng.
* Giống nhau:  Đều gửi dữ liệu tới server để xử lý, sau khi người dùng nhập thông tin vào Form
* Khác nhau:
** POST:Bảo mật hơn POST vì dữ liệu được gửi ngầm, không xuất hiện trên URL
** GET:Dữ liệu được gửi tường minh, chúng ta có thể nhìn thấy trên URL, đây là lý do khiến nó không bảo mật so
với POST

**GET thực thi nhanh hơn POST vì nhứng dữ  liệu gủi đi luôn được Webbrowser cached lại

**Khi dùng phương thức POST thì server luôn thực thi và trả về kết quả cho client, còn GET sẽ xem xét ứng với cùng 1 yêu cầu  sẽ xem trong cached có kết quả tương ứng với yêu cầu sẽ trả về ngay không cần phải thực thi các yêu cầu đó ở phía server

** Đối với những dự liệu luôn được thay đổi thì chúng ta nên sử  dụng phương thức POST, còn dữ  liệu ít thay đổi chúng ta dùng phương thức GET để truy xuất và xử lý nhanh hơn